使用opencv检测视频人脸

使用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()# 释放内存

效果图如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51205301/article/details/127156902