1.引言
OpenCV(Intel·Open Source Computer Vision Library)是Intel 公司面向应用程序开发者开发的计算机视觉库,其中包含大量的函数用来处理计算机视觉领域中常见的问题,例如运动分析和跟踪、人脸识别、3D 重建和目标识别等[1].可以通过访问https://www.source- forge.net/projects/opencvlibrary 获得OpenCV 库以及相关的资料。另外, 还可以通过访问https://www.yahoogroups.com/group/OpenCV, 对于OpenCV使用中的一些问题与经验进行讨论。
相对于其它图像函数库, OpenCV 是一种源码开放式的函数库, 开发者可以自由地调用函数库中的相关处理函数。OpenCV 中包含300多个处理函数[1], 具备强大的图像和矩阵运算能力, 可以大大减少开发者的编程工作量, 有效提高开发效率和程序运行的可靠性。另外, 由于OpenCV 具有很好的移植性, 开发者可以根据需要在MS-Windows 和Linux 两种平台进行开发[2].
人脸检测(Face Detection)是指在输入图像中确定所有人脸(如果存在)的位置、大小、位姿的过程。人脸检测作为人脸信息处理中的一项关键技术, 近年来成为模式识别与计算机视觉领域内一项受到普遍重视、研究十分活跃的课题。人脸检测问题初来源于人脸识别(FaceRecognition)。人脸识别的研究可以追溯到上个世纪六、七十年代, 经过几十年的曲折发展已日趋成熟。人脸检测是自动人脸识别系统中的一个关键环节, 但是早期的人脸识别研究主要针对具有较强约束条件的人脸图像(如无背景的图像), 往往假设人脸位置已知或很容易获得, 因此人脸检测问题并未受到重视。近几年随着电子商务等应用的发展,人脸识别成为有潜力的生物身份验证手段, 这种应用背景要求自动人脸识别系统能够对一般由此所面临的一系列问题使得人脸检测开始作为一个独立的课题受到研究者的重视。今天, 人脸检测的应用背景已经远远超出了人脸识别系统的范畴, 在基于内容的检索、数字视频处理、视觉监测等方面有着重要的应用价值。
人脸检测研究具有重要的学术价值。人脸是一类具有相当复杂的细节变化的自然结构目标, 此类目标的检测问题的挑战性在于: (1)人脸由于外貌、表情、肤色等不同, 具有模式的可变性; (2)一般可能存在眼镜、胡须等附属物; (3)作为三维物体的人脸的影像不可避免地受由光照产生的阴影的影响。因此, 如果能够找到解决这些问题的方法, 成功构造出人脸检测与跟踪系统, 将为解决其它类似的复杂模式检测问题提供重要的启示。
目前, 国外对人脸检测问题的研究很多, 比较着名的有MIT, CMU等; 国内的清华大学、北京工业大学、中科院计算所和自动化所等都有人员从事人脸检测相关的研究。而且, MPEG7 标准组织已经建立了人脸识别草案小组, 人脸检测算法也是一项征集的内容。随着人脸检测研究的深入, 国际上发表的有关论文数量也大幅度增长。
2.系统设计
本文采用OpenCV 实现人脸检测的原理是基于Adaboost 算法, 该算法是一种分类器算法, 其基本思想是利用大量的分类能力一般的简单分类器(Basic classifier)通过一定的方法叠加(boost)起来, 构成一个分类能力很强的强分类器(Stage classifier), 再将若干个强分类器串联成为分级分类器(classifier cascade)完成图像搜索检测。串联的级数依赖于系统对错误率和识别速度的要求。
本系统由训练和检测两个模块完成, 两部分的流程图如图1 和图2 所示:
图1 训练程序流程图
图2 检测程序流程图
3.系统实现
本系统采用Microsoft VC++编程工具实现, 从OpenCV 网站上OpenCV 的版本后按照安装说明安装OpenCV 开发包, 并在VC++系统中配置好开发环境。系统中实现的主要检测函数如下, 其中调用了OpenCV 函数库中的部分函数。
CRect CFaceDetect::DetectAndDrawFaces( IplImage* img )
{
CRect rc(0,0,0,0);
if( m_pHidCascade && img )
{
int scale = 2;
CvSize img_size = cvGetSize( img );
IplImage* temp = cvCreateImage ( cvSize (img_size.width/2,
img_size.height/2), 8, 3 );
int i;
cvPyrDown( img, temp );
cvClearMemStorage( m_pStorage );
if( m_pHidCascade )
{
CvSeq* faces = cvHaarDetectObjects ( temp,
m_pHidCascade, m_pStorage, 1.2, 2, 1 );
for( i = 0; i < (faces ? faces- >total : 0); i++ )
{
CvRect r = *(CvRect*)cvGetSeqElem( faces, i );
cvRectangle( img,
cvPoint(r.x*scale, r.y*scale),
cvPoint ((r.x+r.width)*scale, (r.y+r.height)
*scale),
CV_RGB(255,0,0), 3 );
rc.left = r.x*scale;
rc.top = r.y*scale;
rc.right = (r.x+r.width)*scale;
rc.bottom = (r.y+r.height)*scale;
}
}
cvReleaseImage( &temp );
}
return rc;
}
其中函数cvHaarDetectObjects 使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域, 并且将这些区域作为一序列的矩形框返回。函数以不同比例大小的扫描窗口对图像进行几次搜索。每次都要对图像中的这些重叠区域利用cvRunHaarClassifierCascade进行检测。有时候也会利用某些继承(heuristics)技术以减少分析的候选区域, 例如利用Canny 裁减(pruning)方法。函数在处理和收集到候选的方框(全部通过级联分类器各层的区域) 科之后, 接着对这些区域进行组合并且返回一系列各个足够大的组合中的平均矩形。调节程序中的缺省参数(scale_factor=1.1, min_neighbors=3,flags=0)用于对目标进行更同时也是耗时较长的进一步检测。为了能对视频图像进行更快的实时检测, 参数设置通常是: scale_factor=1.2,min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING,min_size =<minimumpossible face size.
4.结束语
通过编程实现人脸检测系统表明, 应用OpenCV 函数库进行图像处理编程, 功能强大, 简捷高效, 可以使编程人员快速地实现算法。
OpenCV 确实为VC++编程处理数字图像提供了极大的方便, 具有广阔的应用前景。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。