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人脸检测算法的检测结果