1,人脸检测简介
人脸检测的模型主要有两类,一类是知识模型,根据眼睛、嘴、鼻子的相对位置或面部不同部位的颜色深度差异来检测人脸,另一类是统计模型,把海量的人脸数据转换成二维像素矩阵,从统计的观点出发构建人脸模式空间判断人脸是否存在。
2,特征数据
最常用到的三种特征分别为Haar特征、LBP特征及HOG特征,三种特征描述了三种不同的局部信息:
(1) Haar描述的是图像在局部范围内像素值明暗变换信息;
(2)LBP描述的是图像在局部范围内对应的纹理信息;
(3)HOG描述的则是图像在局部范围内对应的形状边缘梯度信息。
其中,OpenCV使用的Haar特征分类器属于第二种模型,训练人脸检测的特征分类器是个非常耗时费力的工作,需要收集大量的正负样本,不过值得庆幸的是OpenCV已经为我们完成了这项工作。关于Haar的具体原理和算法请大家自行百度,简单点说Haar特征分类器是xml文件,记录了面部正面、侧面、左右眼、鼻子、笑脸、上半身等多个Haar特征数据,通过对输入图片进行级联筛选查找人脸
3.人脸检测的实现
在搜索“github opencv”,在“opencv/data/haarcascades”目录下可以看到各种各样的特征分类器(xml文件),从文件名上可以轻易区分出分类器的用途,如“haarcascadesfrontalface_default.xml”是脸部正面特征分类器。https://github.com/opencv/opencv/tree/master/dat
源代码示例:
import cv2 as cv
import numpy as npdef face_detect_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#转化为灰度图face_detector = cv.CascadeClassifier("F:/images/haarcascade_frontalface_alt_tree.xml")#利用级联检测器加载特征数据faces = face_detector.detectMultiScale(gray, 1.02, 5)for x, y, w, h in faces:cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)cv.imshow("result", image)#cv.cv.waitKey(10)src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
"""
cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
capture = cv.VideoCapture(0)
cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
while(True):ret, frame = capture.read()frame = cv.flip(frame, 1)face_detect_demo(frame)c = cv.waitKey(10)if c == 27: # ESCbreak
#在视频中定位人脸
"""
cv.imshow("input image", src)
face_detect_demo(src)cv.waitKey(0)cv.destroyAllWindows()
运行结果: