首页 » 刷脸背后:人脸检测 人脸识别 人脸检索 » 刷脸背后:人脸检测 人脸识别 人脸检索全文在线阅读

《刷脸背后:人脸检测 人脸识别 人脸检索》3.3 Viola&Jones人脸检测算法

关灯直达底部

OpenCV是一种采用C/C++编写的开源计算机视觉库,它可以很方便地用于图像处理和分析。OpenCV视觉库中包含开源的人脸检测程序,本部分主要使用的是OpenCV中的Viola&Jones人脸检测算法,该算法可以高效地进行人脸检测。

3.3.1 Viola&Jones人脸检测算法的使用

新建Viola&Jones人脸检测程序,对应的项目名称为facedet_opencv。该程序需要在Visual Studio平台上安装OpenCV才能运行,我们测试使用的是Visual Studio 2010和OpenCV2.4.9。读者首先要确保安装了这两个软件,打开facedet_opencv.sln后,还要进行一些配置修改,具体如下。

· 在项目上单击鼠标右键,选择“属性”→“配置属性”→“VC++目录”→“包含目录和库目录”进行修改,修改为自己计算机的OpenCV对应的路径。

· 如果你使用的不是OpenCV2.4.9,则还需要在项目上单击鼠标右键,选择“属性”→“配置属性”→“连接器”→“输入”→“附加依赖项”进行修改。

此时程序就可以正常运行。

测试图片在facedet_opencv/facedet_opencv/image文件夹下。

检测结果在facedet_opencv/facedet_opencv/opencv_result文件夹下。

读者可根据实际情况,在facedection.cpp中修改测试图片和检测结果的存放路径。

最后运行facedection.cpp,即可使用该算法进行人脸检测。

3.3.2 Viola&Jones人脸检测算法的原理

Viola&Jones人脸检测算法主要基于Viola&Jones检测器,该检测器是由Paul Viola和Michael Jones在2001年发表的[9],它可以快速、高效地检测人脸。

Viola&Jones检测器主要分为三部分:

(1)使用积分通道快速计算图像的特征值。

(2)利用AdaBoost分类器筛选特征。

(3)将AdaBoost分类器改为级联的分类器,从而快速丢弃非人脸的特征。

OpenCV视觉库中包含了训练好的脸部级联分类器,我们使用的是:

haarcascade_frontalface_alt.xml

下面我们结合一些主要代码对该算法进行分析。

Code6中的主函数facedection.cpp的功能就是加载级联分类器、读入图片,然后调用detectAndDraw函数进行人脸检测和在图片上标记对应的人脸检测框。

Code7的detectAndDraw函数是实现Viola&Jones人脸检测的主要过程,首先对图片进行预处理;然后调用CascadeClassifier的detectMultiScale方法[10],即可得到最终的人脸检测框;最后在图片上标记人脸检测框。Code6和Code7均来自OpenCV官方网站。

Code6:facedection.cpp

Code7:detectAndDraw函数

Viola&Jones图像预处理的步骤如下。

预处理1:将图片按一定比例缩小。

预处理2:detectMultiScale方法需要CV_8U矩阵数据作为输入,首先要将图片转换为灰度图像。

预处理3:使用直方图均衡化进行处理,使级联分类器分析起来更方便。

方法detectMultiScale的一些主要参数的分析如下。

· Mat矩阵image——传入的图片,格式是CV_8U。

· 向量objects——检测到的所有检测框的位置。

· scaleFactor——每张图片缩放的比例。

· minNeighbors——每个候选检测框应该至少有的邻近元素个数。

· SizeminSize、SizemaxSize限定目标检测框的范围,即Size(30,30)。

3.3.3 Viola&Jones人脸检测算法的检测结果

经过大量的测试发现,Viola&Jones人脸检测算法能够很好地检测正脸,即使检测大尺寸图片,它也可以在短时间内得到很好的检测效果,但是它不能很好地检测非正脸的图片,如图3-4的(a)、(b)、(e),这类图片Viola&Jones都检测不到。在图3-7中,我们呈现了一些有代表性的图片的检测结果。

图3-7 Viola&Jones人脸检测算法的检测结果