opencv-python基础
我,将某个人,唯一的某个人,试图锁定。我,

opencv-python基础

00安装

pip install opencv-python


01导入模块

import cv2 #默认BGR


02.0读取图片并展示

import cv2 #默认BGR 下面rgb
# import matplotlib.pyplot as plt
#路径
path="../picture/cat1.jpg"
#读取图片
img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)#路劲 读取形式(这里以灰度图形式等下展示的为灰度图)
#打印图片矩阵
print(img)
cv2.imshow('image',img)#窗口名称,展示的内容
#等待
cv2.waitKey(0)
cv2.destroyAllWindows()#触发关闭 任意键触发

#保存
cv2.imwrite('mycat.png',img)#名称,内容

02.1视频或摄像头读取

import cv2
#读取视频
#cap = cv2.VideoCapture("asd.mp4")#读取路径 填数字代表摄像头0代表第一个摄像头
#读取摄像头
cap = cv2.VideoCapture(0)#读取路径 填数字代表摄像头0代表第一个摄像头
while(True):

    ret, frame = cap.read()  # 读取一帧的图像 ret是否成功读取 frame 为图片内容

    cv2.imshow('Face Recognition', frame)#窗口展示与上面图片展示一样
    if cv2.waitKey(1) & 0xFF == ord('q'):#等待触发与上面图片cv2.destroyAllWindows()#触发关闭 任意键触一样 这里是指定键可以换其他
        break

cap.release()  # 释放摄像头
cv2.destroyAllWindows()


03保存

#保存
cv2.imwrite('mycat.png',img)

print("格式",type(img))#格式

print(img.size,"#像素点")#像素点

print("数据类型",img.dtype)#数据类型

图片处理

04截取部分图像

import cv2 #默认BGR 下面rgb
import matplotlib.pyplot as plt
import numpy as np
# %matplotlib inline #在jupyter才可用
#直接展示  不用调用plt.show

path="../picture/cat1.jpg"#中文路径
#读取
img=cv2.imread(path)
#展示(目的与处理的图片对比)
cv2.imshow('image',img)
#截取
cat=img[50:100,200:400] #高范围,宽范围
#展示截取的图片
cv2.imshow('cat',cat)
cv2.waitKey(0)#等待
cv2.destroyAllWindows()#触发


05颜色通道提取

import cv2 #默认BGR 下面rgb
#为了展示的时候不要写三行代码这么多定义一个展示的函数
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
读取
img=cv2.imread('../picture/cat1.jpg')
# cat=img[0:50,0:200] #高范围,宽范围
# cat=img[100:150,200:400] #高范围,宽范围
#cat=img[50:55,200:204]
#展示原图
cv_show('cat',cat)
#拆分通道
b,g,r=cv2.split(cat)#通道拆分(cv2.split)
print(cat)
print(b)
print(g)
print(r)
# print(r.shape)
#合并通道
img=cv2.merge((b,g,r))#合并(cv2.merge)
print(img.shape)


img=cv2.merge((b,g,r))
print(img.shape)

# 只保留R 其他通道设为0
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)


# 只保留G 其他通道设为0
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)


# 只保留B 其他通道设为0
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)


06边界填充

import cv2 #默认BGR 下面rgb
import matplotlib.pyplot as plt
import numpy as np

img=cv2.imread('../picture/cat1.jpg')

cv2.imshow("name", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

top_size,bottom_size,left_size,right_size = (50,50,50,50)

# BORDER_REPLICATE:复制法,也就是复制最边缘像素。
# BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
# BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
# BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
# BORDER_CONSTANT:常量法,常数值填充。

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)

import matplotlib.pyplot as plt
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

plt.show()


07数值计算以及图片融合


import cv2 #默认BGR 下面rgb
import matplotlib.pyplot as plt
import numpy as np

img_cat =cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')
cv2.imshow("name", img_cat)
cv2.waitKey(0)
cv2.destroyAllWindows()

img_cat2= img_cat +10
print(img_cat[:5,:,0])
cv2.imshow("name", img_cat2)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(img_cat2[:5,:,0])

#相当于% 256
print((img_cat + img_cat2)[:5,:,0] )

print(cv2.add(img_cat,img_cat2)[:5,:,0])

# 图像融合
# img_cat + img_dog
cv2.imshow("name", img_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()
# img_cat.shape
img=cv2.imread('cat.jpg')
img_dog = cv2.resize(img_dog, (500, 414))#把狗变更成(500, 414)
# img_dog.shape
cv2.imshow("name", img_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()



res = cv2.addWeighted(img_cat, 0.5, img_dog, 0.4, 0)
#融合 0.4 权重项 0为亮度微调 R = img_cat x 0.4 +img_dog x0.6 +0

plt.imshow(res)
cv2.imshow("name", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

res = cv2.resize(img, (0, 0), fx=0.4, fy=0.4)#把狗变更成放大4.4
plt.imshow(res)
cv2.imshow("name", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

res = cv2.resize(img, (0, 0), fx=4, fy=4)#把狗变更成放大4.4
plt.imshow(res)
cv2.imshow("name", res)
cv2.waitKey(0)
cv2.destroyAllWindows()



res = cv2.resize(img, (0, 0), fx=1, fy=3)
plt.imshow(res)
cv2.imshow("name", res)
cv2.waitKey(0)
cv2.destroyAllWindows()


08图片画像

import numpy as np
import cv2

# Create a black image
img=np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv2.line(img,(0,0),(511,511),(255,0,0),1)#图 坐标 粗细 划线的
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)#矩形
cv2.circle(img,(447,63), 63, (0,0,255), -1)#画圆 图 圆心 半径 颜色  -1 为画圆面 正数为圆的粗细
cv2.ellipse(img,(256,256),(100,50),90,30,60,(0,255,0),-1)
#中心点的位置坐标 长轴和短轴的长度
# 起点轴角度 椭圆沿逆时针方向旋转的角度  椭圆沿顺时针方向旋转的角度 如果是0和360就是整个椭圆

# 画多䥨形
pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
# pts=pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(255,0,0),1)
# 3 # 䦈䭻 reshape 的第一个参数为-1, 䈗明䦈一维的伮度是根据后儑的维度的䕐算出来的。
# 如果第三个参数是 False虽我们得到的多䥨形是不侜合的虹卅尾不相
# 䦍虺。

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV Tuts!',(0,130), font, 1, (200,255,155), 2, cv2.LINE_AA)
# 你䌰绘制的文字
#  你䌰绘制的位置
#  字体类型 虹䧉䥶查看 cv2.putText() 的文档找到支持的字体虺
#  字体的大小
#  文字的一般属性如 剋色 虽 粗细 虽线条的类型等。为了更好看一点推荐使用
# linetype=cv2.LINE_AA。

cv2.imshow('image',img)
# cv2.imshow('image',pts)
cv2.waitKey(0)#等待
cv2.destroyAllWindows()#触发

最后用9行代码做个人脸检测功能吧

# -*- coding: utf-8 -*-
#opencv导入的是cv2
import cv2
import face_recognition
#1读图
img = cv2.imread('../picture/zxc.jpg')#路径不可以中文
#获取人脸
locations = face_recognition.face_locations(img)
for top,rigth,bottom,left in locations:
    cv2.rectangle(img,(left,top),(rigth,bottom),(0,0,255),2)#画框

#2展示
# cv2.putText(img, "handsome boy", (100,100-20), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 3)#cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
                                                          #各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细

cv2.imshow('11',img)#中文乱码
#3等待结束
cv2.waitKey(0)#按任意键盘解释

#4销毁窗口
cv2.destroyAllWindows()


捕获视频版人脸检测功能

pip install  opencv-python face_recognition
import cv2
import face_recognition
#导入包
#创建视频捕获对象
vc = cv2.VideoCapture("../vdio/aa.mp4")#0为内置摄像头  #或者放摄像头路径
# vc = cv2.VideoCapture(0)#0为内置摄像头  #或者放摄像头路径

# 循环捕获视频的图片
while True:
    ret,img = vc.read()
    if not ret:
        print('没有捕获到视频')
        break
# 展示图片
    locations = face_recognition.face_locations(img)
    for top, rigth, bottom, left in locations:
        cv2.rectangle(img, (left, top), (rigth, bottom), (0, 0, 255), 2)#画框

    cv2.imshow('me',img)
    if cv2.waitKey(1) != -1:
        #关闭摄像头
        vc.release()
        cv2.destroyAllWindows()
        break
# 等待键盘事件
# 关闭摄像头销毁川



上一篇: 没有了