opencv
start
import cv2
- opencv 是c++ 语言写的, 给Python提供了一个接口,方法放到出cv2 中,所以,导入的包是cv2,
jin = cv2.imread('jin.jpg')
- 读取目录下的jin.jpg图片
人脸识别- 弹出一个窗口,显示图片
cv2.resize(jin,dsize=(1080,607))
# 使用cv2的Cascade分类器获取训练数据,进行训练
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
# 使用Cascade分类器进行预测,会返回识别区域的左上角坐标与宽高
# 利用返回值绘制矩形
# scaleFactor 缩放比例 人脸识别的精细度
# minNeighbors 邻居数量
face_zone = face_detector.detectMultiScale(jin,scaleFactor=1.1,minNeighbors=3)
# x,y 是识别到的人脸区域的左上角坐标x 是高,y 是宽
# w,h 是识别到的人脸区域的高与宽
for x,y,w,h in face_zone:
# cv2的rectangle函数可以绘制矩形
# pt1:矩形左上角坐标,pt2:矩形右下角坐标
cv2.rectangle(jin,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)
cv2.imshow('jinzhengen',jin)
# cv2的imshow会调用自带的图片视频查看器进行显示
# 使用waitKey(0) 则等待点击键盘上的任意键来关闭图像
cv2.waitKey(0)
# 将生成的对象销毁掉,释放内存
# 此步骤是必须的,否则会出现崩溃
cv2.destroyAllWindows()
同样,也可以进行其他的识别,如眼,嘴
yong = cv2.imread('yong.jpg')
eye_detector = cv2.CascadeClassifier('haarcascade_eye.xml')
eye_zone = eye_detector.detectMultiScale(yong,scaleFactor = 1.3,minNeighbors=5)
for x,y,w,h in eye_zone:
cv2.rectangle(yong,pt1 = (x,y),pt2=(x+w,y+h),color=[0,255,0],thickness=2)
mouth_detector = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
mouth_zone = mouth_detector.detectMultiScale(yong,scaleFactor = 1.3,minNeighbors=15)
for x,y,w,h in mouth_zone:
cv2.rectangle(yong,pt1 = (x,y),pt2=(x+w,y+h),color=[0,255,255],thickness=2)
cv2.imshow('yong',yong)
while True:
# waitKey可以识别键盘的输入
if ord('q')==cv2.waitKey(3000):
break
else:
print('请输入q')
cv2.destroyAllWindows()
还可以识别视频
把视频文件的每一帧图片进行处理,然后放映出来
import numpy as np
视频的读取与写入
# 使用VideoCapture 获取视频,获取后,cv2中会存有视频的各种数据
cap = cv2.VideoCapture('law.mp4')
# 四个字符表示压缩帧的编码 此为MPEG-4.2,为保存的文件设置
fourcc = cv2.VideoWriter_fourcc("M","P",'4','2')
# 通过get获取cv2中保存的视频的各项数据
fps = cap.get(cv2.CAP_PROP_FPS) # 每秒帧率 24
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# cv2的写入
video_write = cv2.VideoWriter(filename='law.avi',fourcc=fourcc,fps=fps,frameSize=(w,h))
zhen_sum = cap.get(cv2.CAP_PROP_FRAME_COUNT) # 总帧数 3397
视频时长 = 总帧数 / 每秒帧率
3397/24 ~= 141.5
显示视频,存储视频
# 读帧 返回只有两个,第二个为图片,第一个参数记录函数是否成功返回,cap中存储了此帧图片的某些相关信息,如下一帧
flag,frame = cap.read()
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
num=0
while flag:
face_zone = face_detector.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=3)
for x,y,w,h in face_zone:
cv2.rectangle(frame,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)
# 对前三秒和最后一秒进行灰度化操作
if num < 3*24:
# cvtColor改变图片的颜色,通过code属性
frame = cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY)
# 上述方法后是三通道组合后的灰度,通过reshape变成单通道灰度
frame = frame.reshape(frame.shape[0],frame.shape[1],1)
# 上述方法后是单通道组合后的灰度,通过concatenate变成三通道灰度
frame = np.concatenate([frame,frame,frame],axis=-1)
elif num > 140*24:
frame = cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY) # 2维度的
frame = frame.reshape(frame.shape[0],frame.shape[1],1)
frame = np.concatenate([frame,frame,frame],axis=-1)
# 展示图片
cv2.imshow('law',frame)
# 写入一帧图片
video_write.write(frame)
# read() 会自动获取cap中的信息调用下一帧
flag,frame = cap.read()
if cv2.waitKey(1) == ord('q'):
break
num +=1
cv2.destroyAllWindows()
cap.release()
video_write.release()
打开摄像头进行头像识别
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
导入一张图片,进行处理,在之后进行人脸识别后,用以替换
import matplotlib.pyplot as plt
head = cv2.imread('cat8.jpg')
head = head[100:500,450:850]
# head = cv2.resize(head,dsize=(1800,1500))
plt.imshow(head)
# 当VideoCapture的参数为0时,会从摄像头获取图像
cap = cv2.VideoCapture(0)
flag,frame = cap.read()
while flag:
face_core = face_detector.detectMultiScale(frame,scaleFactor = 1.1,minNeighbors = 3)
for x,y,w,h in face_core:
# cv2 的resize() 方法可以更改图片的大小
# 将其大小与识别的人脸区域相匹配
he = cv2.resize(head,dsize=(w,h))
for i in range(h):
for j in range(w):
if (i - h/2)**2 + (j-w/2)**2 <= (w/2)**2:
frame[y+i,x+j] = he[i,j]
cv2.imshow('capture',frame)
if cv2.waitKey(1) == ord('q'):
break
flag,frame = cap.read()
cv2.destroyAllWindows()
cap.release()
import cv2
import cv2
import cv2
import cv2