人脸检测部分,我们需要使用到opencv,看清楚,是opencv,不是opencv_python
首先,我们打开opencv的官网:opencv.org/#
当然,纯英文的。
我们找到library目录下的release目录:
选择你需要的版本,下载对应的平台就好。如下图所示,我当然要尝试最新版的了。
下载完成之后,双击安装就可以了。
我理解的人脸检测呢,其实就是opencv根据采集到的图像与其库中预置的人脸特征去比对,有符合人脸特征的,就说明采集到的图像是有人脸的。初学,我也不清楚我说的是否正确。
有不对的地方,欢迎大佬指出。
我们来打开opencv的安装目录:
其中 build 是 OpenCV 使用时要用到的一些库文件,sources 中则是 OpenCV 官方为我们提供的一些 demo 示例源码
按照我上边的猜想的人脸识别的原理。
我们需要先找到opencv预置的人脸特征,在sources\data\haarcascades目录下,那么每个文件都是干啥的呢?
人脸检测器(默认) : haarcascade_frontalface_default.xml
人脸检测器(快速 Harr) : haarcascade_frontalface_alt2.xml
人脸检测器(侧视) : haarcascade_profileface.xml
眼部检测器(左眼) : haarcascade_lefteye_2splits.xml
眼部检测器(右眼) : haarcascade_righteye_2splits.xml
嘴部检测器: haarcascade_mcs_mouth.xml
鼻子检测器: haarcascade_mcs_nose.xml
身体检测器: haarcascade_fullbody.xml
人脸检测器(快速 LBP) : lbpcascade_frontalface.xml
一:人脸检测
好了,准备工作大概就是这个样子,我们使用代码来测试一下:
python
复制代码
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2022/3/22 19:15 # @Author : stone # @Email : 805795955@qq.com # @File : task.py # @Software: PyCharm import cv2 as cv def face_detect_demo(): """ 人脸检测方法 """ # 将图片转换为灰度图片 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('C:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 获取检测到的人脸区域 faces = face_detector.detectMultiScale(gray) print(faces) # 将检测到的人脸区域画框 for x, y, w, h in faces: cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness = 2) cv.imshow('result', img) # 加载图片 img = cv.imread('tu2.jpg') # 调用 人脸检测方法 face_detect_demo() cv.waitKey(0) cv.destroyAllWindows()
指向上方代码,如下图所示:
我们可以看到,人脸正儿八经的检测到了,但是还有两个小区域,可能是灰度转换后与人脸特征较为相近,也被识别成人脸了。
二:多张人脸检测
当然,一张图中只有一个人脸显然是不太符合我们的实际应用的,那么我们还是要试一下一张图片中有多张人脸的效果如何:
代码不变,换一张多人脸的图,直接执行,如下图所示:
三张人脸是检测到了,但是可能是图中元素较多,一些不是人脸的地方,也被识别成了人脸。
这部分,我们可以通过调整检测部分代码来实现精确识别
ini
复制代码
# scaleFactor 缩放比例 minNeighbors 检测次数 maxSize 最大检测区域 minSize 最小检测区域 faces = face_detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=10,maxSize=(300,300),minSize=(190,190))
经过上边的调整,检测到的人脸区域,如下图所示:
三:视频人脸检测
视频人脸检测,本质上还是检测图片中的人脸,因为视频也是由一张一张图片组成的,像目前主流的相机拍摄的视频一般都是4k60p,也就是图片分辨率是4k,一秒钟播放60张照片。
下边我们使用代码来测试一下,视频中的人脸检测:
ruby
复制代码
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2022/3/22 19:15 # @Author : stone # @Email : 805795955@qq.com # @File : task.py # @Software: PyCharm import cv2 as cv def face_detect_demo(img): #将图片灰度 gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY) #加载特征数据 face_detector = cv.CascadeClassifier( 'C:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') faces = face_detector.detectMultiScale(gray,scaleFactor=1.2, minNeighbors=10) print(faces) for x,y,w,h in faces: cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2) # cv.circle(img,center=(x+w//2,y+h//2),radius=(w//2),color=(0,255,0),thickness=2) cv.imshow('result',img) #读取视频 cap=cv.VideoCapture('video.mp4') while True: flag,frame=cap.read() # print('flag:',flag,'frame.shape:',frame.shape) if not flag: break face_detect_demo(frame) if ord('q') == cv.waitKey(10): break cv.destroyAllWindows() cap.release()
运行代码,效果如下:
以上大概就是人脸检测的基本使用代码。
有好的建议,请在下方输入你的评论。