OpenCV3 人脸检测
人脸检测
人脸检测跟其他目标检测一样,需要对目标分类与位置跟踪。
因此提取图像的特征对于产生稳定的分类结果和跟踪结果是很有用的。
OpenCV的人脸检测的话可以直接使用Haar级联分类器。
Haar级联分类器
对给定的图像,特征可能会因为区域大小而有所不同,区域大小也称为窗口大小.即使窗口大小不一样,仅在尺度不同的两图像也应该有相似的特征.这些特征集合成为级联.Haar级联具有尺度不变性,换句话说在尺度变化上具有鲁棒性.OpenCV提供了尺度不变的Haar级联的分类器和跟踪器,并可将其保存为指定的文件格式.
OpenCV的Haar级联不具有旋转不变形.(如:Haar级联不认为倒置的人脸图像和直立的图像一样,而侧面的人脸图像与正面的人脸图像也不一样.可通过多种图像变换和多窗口大小来提高Haar级联鲁棒性但这样会变得很复杂,而且会消耗更多计算机资源.
获取Haar级联数据
有两种方法:
- 可在Github上下载(https://github.com/opencv/open_model_zoo)
- 可下载OpenCV安装包(https://sourceforge.net/projects/opencvlibrary/files/)
我选第二种,下载好后解压,然后在opencv\sources\data\haarcascades中寻找
做人脸检测一般使用红色框内的几个Haar分类器。
静态图片中的人脸检测
import cv2
filename = 'cascades/2.jpg' def detect(filename): face_cascade = cv2.CascadeClassifier( 'cascades/haarcascade_frontalface_default.xml') img = cv2.imread(filename) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3,3) print("发现{0}个人脸".format(len(faces))) font = cv2.FONT_ITALIC cv2.putText(img,"There have {0} people".format(len(faces)), (0,440), font, 1, (0, 0, 255), 2) b=1 for (x, y, w, h) in faces: img = cv2.rectangle(img, (x, y), (x+w, y+h),(0, 255 ,0),2) a=img[y:y+h,x:x+w] b+=1 font = cv2.FONT_ITALIC cv2.putText(img, '{0}'.format(b-1), (x + w - 2, y + h - 2), font, 1, (0, 255, 255), 2) cv2.namedWindow('detect') cv2.imshow('detect',img) cv2.waitKey(0) detect(filename)
处理结果:
其中
face_cascade = cv2.CascadeClassifier( 'cascades/haarcascade_frontalface_default.xml')
是加载分类器,face_cascade是CascadeClassifier对象,负责人脸检测
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
转为灰度图像,便于计算,因为人脸检测需要这样的色彩空间
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3,3)
加载文件,转为灰度图像,进行实际人脸检测,
其中传递参数为scaleFactor和minNeighbors分别表示检测过程每次迭代图像压缩率以及人脸矩形保留近邻数目最小值。
for (x, y, w, h) in faces: img = cv2.rectangle(img, (x, y), (x+w, y+h),(0, 255 ,0),2) a=img[y:y+h,x:x+w]
b+=1 font = cv2.FONT_ITALIC cv2.putText(img, '{0}'.format(b-1), (x + w - 2, y + h - 2), font, 1, (0, 255, 255), 2)
将每个人脸循环遍历,x,y表示左上角坐标,w,h表示人脸矩形宽,高
然后传入原图进行矩形框绘图,标号。cv2.FONT_ITALIC是设置字体。
detect(filename)
运行程序得到结果。
经过测试,OpenCV提供的Haar人脸分类器中,haarcascade_frontalface_default.xml效果相对于来说最好。