本节介绍如何使用OpenCV已经分类好的级联分类器来实现人脸的检测,并在检测到的地方做上标记。
[TOC]
分类器的种类和加载
在OpenCV中,可以调用已经训练好的级联分类器。训练分类器非常耗费时间。现成的一些分类器已经可以用来检测人脸及相关特征(例如眼睛和鼻子)、人类和其他物体。这些级联分类器以XML 文件存放在OpenCV源文件的data目录中,加载不同的联级分类器的XML文件就可以实现不同对象的检测。
OpenCV自带的联级分类器在OpenCV根目录的data文件夹中,分别有三个子文件夹:haarcascades
、hogcacades
、lbpcascades
,里面分别存储的是Haar级联分类器、HOG级联分类器、LBP级联分类器。
Haar级联分类器多达20多种,且还在继续更新。部分如下表所示。
加载级联分类器的语法:
<CascadeClassifier object> = cv2.CascadeClassifier( filename )
- filename是分类器的路径和名称
使用级联分类器时需要注意,在anaconda中使用pip安装的OpenCV,则无法直接获取级联分类器的XML文件。可以通过以下两种方式:
- 在OpenCV的安装目录下的data文件夹内查找XML文件
- 在网络上下载相应的XML文件,下载并使用
函数使用
人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()
函数。可以检测图片中的所有人脸。
object = cv2.CascadeClassifier.detectMultiScale(image[, scaleFactor=None[, minNeighbors=None[, flags=None[, minSize=None[, maxSize=None]]]]]):
- image:待检测的图像,通常为灰度图像
- scaleFactor:表示在前后两次相继的扫描中,搜索窗口的缩放比例
- minNeighbors:表示构成检测目标的相邻矩形的最小个数。默认值为3,表示有3个以上的检测标记存在时,才认为人脸的存在。如果希望提高检测的准确率,可以将该值设置的更大,但同时可能会让一些人脸无法被检测到
- flags:不常用参数,一般省略。
- minSize:目标的最小尺寸,小于这个尺寸的目标将被忽略
- maxSize:目标的最大尺寸,大于这个尺寸的目标将被忽略
- objects:返回值,目标对象的矩形框向量组
人脸识别案例
import cv2
#读取待检测的图像
image = cv2.imread('test.png')
# 获取xml文件,加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 调用函数detectMultiScale
faces = faceCascade.detectMultiScale(
gray,
scaleFactor = 1.2,
minNeighbors = 4,
minSize = (4,4)
)
print(faces)
#打印输出测试结果
print("发现{0}个人脸!".format(len(faces)))
#逐个标记人脸
for(x,y,w,h) in faces:
# cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2) #矩形标注
cv2.circle(image,(int((x+x+w)/2),int((y+y+h)/2)),int(w/2),(0,255,0),2)
#显示结果
cv2.imshow("dect",image)
#保存检测结果
cv2.imwrite("re.jpg",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
识别结果:
haarcascade_frontalface_default.xml源文件下载
提供了别的人脸识别素材: