使用opencv检测视频中的人脸
在github上搜索opencv获取人脸特征文件。
点击进去后在data文件中找到haarcascades文件,里面都是已经训练好的关于人脸的特征。
下载需要的人脸特征文件。
在代码中应用该文件。
import cv2
if __name__ == '__main__':
video = cv2.VideoCapture('./test.mp4') # 视频 频率24帧/s
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
while True:
# retval表明是否获得了图片 image是获取的图片
retval, image = video.read()
# 当retval为false时,说明视频读取完成,没有图片了
if retval==False:
print("视频播放完成")
break
# 检测到人脸检测特征
faces = face_detector.detectMultiScale(image)
# 可能会检测多张人脸,循环faces,在人脸的位置画上矩形
for x,y,w,h in faces:
# x,y是坐标,w为宽度,h为高度,color为矩形的颜色,thickness为线宽
cv2.rectangle(image,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)
# 等待用户输入
cv2.imshow('video', image)
key = cv2.waitKey(1)
if key == ord('q'):
print("退出视频")
break
cv2.destroyAllWindows()
video.release()# 释放内存
该视频是在视觉中国旗下网站中下载的。https://www.vcg.com/
效果图如下:
此时的人脸检测耗时很大,视频播放会有卡顿,可将图片转换成灰度图片(这样不会影响人脸检测的准确性),减少图片信息,这样效率就会变高一点。
# 把图像转换为灰度图像,减少图片信息
gray = cv2.cvtColor(image,code=cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray) # 检测灰度图片
也可通过缩小图片尺寸,来提高人脸检测效率。
把视频中人脸打上马赛克
需要导入numpy包
import cv2
import numpy as np
if __name__ == '__main__':
video = cv2.VideoCapture('./test.mp4') # 视频 频率24帧/s
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
while True:
retval, image = video.read()
if retval==False:
print("视频播放完成")
break
# 把图像转换为灰度图像,减少图片信息
gray = cv2.cvtColor(image,code=cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray) # 检测灰度图片
for x,y,w,h in faces:
# 取出视频中人脸
face = image[y:y+h,x:x+w]
# 每隔15个取一个
face = face[::15,::15]
# 进行放大
face = np.repeat(np.repeat(face,15,axis = 0),15,axis = 1)
# 得到尺寸不一定合适,进行高度和宽度上的切片即可
image[y:y+h,x:x+w] = face[:h,:w]
# 等待用户输入
key = cv2.waitKey(1)
cv2.imshow('video', image)
if key == ord('q'):
print("退出视频")
break
cv2.destroyAllWindows()
video.release()# 释放内存
效果图如下: