用OpenCV实现简单的人脸识别,基于静态图像。
1、材料准备:找到OpenCV提供的人脸训练模型文件。可以通过
https://github.com/opencv/opencv/tree/master/data/haarcascades
下载OpenCV源代码文件,在其中opencv-master\data\haarcascades目录下找到各种xml文件,全部复制出来,放在代码同级目录下新建的cascades文件夹中。如果是通过pip安装的OpenCV,可以在python安装路径\Lib\site-packages\cv2\data下找到。
2、实现代码:
from cv2 import cv2
#加载人脸训练模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade.load('C:/SOURCE/python/OpenCV/facedetect/cascades/haarcascade_frontalface_default.xml')
#加载影像并转为灰度图
img = cv2.imread('C:/Users/admin/Desktop/test/face.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#进行人脸检测
faces = face_cascade.detectMultiScale(gray,1.2,5)
#显示检测结果,用绿色方框围绕识别到的人脸
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.namedWindow('faces detected!')
cv2.imshow('faces detected!',img)
#保存结果图像
cv2.imwrite('C:/Users/admin/Desktop/test/facesdetect.png',img)
cv2.waitKey()
cv2.destroyAllWindows()
3、测试
原图:
运行结果:
4、分析。其中核心代码 face_cascade.detectMultiScale(gray,1.2,1),第一个参数为输入图像(灰度图);第二个参数为每次迭代的压缩率,参数值要大于1.0,否则报错,值越大,检出人脸越少,可以根据实际检测图像进行调整;第三个参数为最小临近值,取值大于等于0,即检测到人脸后超过一定距离才会进行检测。经过不同参数测试,图像中人脸有部分始终无法检测,也存在部分区域被错误识别为人脸,估计是受训练模型的限制,如果用更多的人脸图像进行训练,结果精度应该会有所提高。