当前位置:文档之家› 基于OpenCV的人脸检测算法研究

基于OpenCV的人脸检测算法研究

第8卷第3期2009年8月 淮阴师范学院学报(自然科学版)JOURNA L OF HUAIYIN TE ACHERS CO LLEGE (NAT URA L SCIE NCE E DITION ) V ol 18N o 13Aug.2009 基于OpenCV 的人脸检测算法研究齐金山(淮阴师范学院计算机科学与技术学院,江苏淮安 223300)摘 要:介绍了一种开放源代码的计算机视觉类库OpenCv ,阐述了该软件的特点及结构,并对其在Visual C ++2005开发环境下的配置作了详细的说明.然后提出了一个基于OpenCv 的人脸检测算法.实验结果表明,该算法具有识别效果、实时性好,检测速度快的特点.关键词:OpenC V ;人脸检测;I pIImage中图分类号:TP391.41 文献标识码:A 文章编号:167126876(2009)0320216205 收稿日期:2009205222 作者简介:齐金山(19772),男,湖南株洲人,讲师,硕士,研究方向为数字图像处理.0 引言人脸的检测是一类具有很大挑战性的问题[1],其主要难点在于:人脸是一类高度非刚性的目标,存在相貌、表情、肤色等差异;人脸上可能会存在一些附属物如眼镜、胡须等;人脸的姿态变化万化,并且可能存在遮挡物;待检测图像性质的差异,比如:待检图像的分辨率、摄录器材的质量等.针对以上难点,各国的科研人员作了很多的研究,每年在国际国内的相关期刊和会议上都有大量的关于人脸检测的论文,如Chellappa 、Zhao 等人分别于1995和2003年发表的两篇人脸识别的综述论文[2,3].人脸检测的算法也很多,Boosting 算法[4]是其中的一种,但Boosting 算法十分复杂.本文提出了基于OpenC V 进行人脸检测将比较容易实现,实验结果表明该算法具有识别效果好、实时性好、检测速度快的特点.1 OpenCv 简介OpenC V (Open S ource C om puter Vision Library )是指Intel 计算机视觉库[5].它由一系列C 函数和少量C ++类构成,实现了图像处理和计算机视觉方面的很多通用算法.OpenC V 主要用于对图像进行一些高级处理,比如说特征检测与跟踪、运动分析、目标分割与识别以及3D 重建等.由于OpenCv 的源代码是完全开放的,而且源代码的编写简洁而高效,特别是其中大部分的函数都已经通过汇编最优化,以使之能高效而充分地利用英特尔系列处理芯片的设计体系,对于Pentium M MX 、Pentium 、Pentium HI 及Pentium 4这些处理器而言,OpenCv 的代码执行效率是非常高的,所以近年来在国外的图像处理相关领域中被广泛地使用,成为一种流行的图像处理软件.111 OpenCv 的特点相对于MAT LAB 等其它常用的图像处理软件来说,OpenCv 有其显著的不可比拟的优点,主要体现在如下几个方面:1)OpenCv 是一个包含了超过300个C 函数的应用编程接口,它不依赖于外部库,既可以独立运行,也可在运行时使用其它外部库.2)高性能:OpenCv 中所有的算法都是基于封装于IP L 的具有很高灵活性的动态数据结构,而且其中有一半以上的函数在设计及汇编时被Intel 公司针对其所生产的处理器优化.3)提供了一些与诸如E iC 、Ch 、MAT LAB 等其它语言或环境的接口,这些接口在其安装完之后位于安装目录opener/interfaces 下.4)开放性:不管对于商业的还是非商业的用途,OpenCv 都是完全免费的,其源代码完全开放,开发者可以对源代码进行修改,将自己设计的新类添加到库中,只要设计符合规范,自己的代码也可以被别人广泛使用.当然OpenCv 的优点并不止这些,使用OpenCv 对开发者来说帮助最大的是:由于OpenCv 的源代码完全开放,所以程序开发者可以仔细地阅读很多关键算法的源代码来理解图像处理中很多算法的原理及整个实现过程,这对于一个程序开发者来说是非常重要的.112 OpenCv 的数据类型以及常用函数OpenCv 包含基础的数据类型和帮助数据类型,基础的数据类型主要包括:图像类的I pIImage ,矩阵类的CvMat ,可变集合类的CvSeq 、CvSet 、CvG raph 以及用于多维柱状图的混合类CvHistogram 等.帮助数据类型主要包括:用于表示二维点坐标的CvP oint ,用于表示图像宽和高的CvSize ,用于表示叠代过程结束条件的CvT ermCriteria ,用于表示图像转换内核的I pIC onvK ernel 和用于表示空间力矩的CvM oments 等.在此仅介绍算法中用到的图像类I pIImage [6].OpenCv 库使用“I pIImagc ”结构体来创建和处理图像,使用此种格式的优点是可以比DI B 格式表示更多的图像性质,而且可以很方便地存取图像中的像素值.I pIImage structure 定义如下: typedef struct I pIImage {int nSize ;//I pIImage 结构的大小 int I D ;//图像头的版本 int nChannels ;//通道数,支持1,2,3,4通道 int alphaChannel ;//alpha 通道数.OpenC V 忽略此项 int depth ;//图像比特深度 char colorM odel[4];//颜色模式 char channelSeq[4];//通道顺序 int dataOrder ;//数据的排列方式 int Origin ;//坐标原点.0代表左上角.1代表左下角 int align ;//OpenC V 忽略此项 int width ;//图像宽度 int height ;//图像高度 struct I pIROI roi ;//指向ROI 结构的指针,不为NU LL 时表示要处理的图像区域 struct I pIImage 3maskROI ;//OpenC V 中指定为NU LL v oid imageId ;//可忽略 struct I pIT ilelnfo 3tilelnfo ;//可忽略 int imageSize ;//图像大小 char 3imageData ;//指向图像数据的指针 int widthStep ;//校准后的行字节数 int BorderM ode[4]://可忽略 int BorderC onst[4];//可忽略 char 3imageData0rigin ;//指向完整的没有校准的图像 }I pIImage ;OpenC V 的函数命名都是以“cv ”开始的,然后是该函数的行为或者作用目标.例如用来创建图像的函数“cvCreateImage ”,载入图像的函数“cv LoadImage ”.OpenC V 是为图像出来及计算机视觉在实际工程中的应用而设计的一个类库,其中所有的函数都由于其在实际应用中所实现的功能而分属不同的类型,主要的函数类型有:1)基本的图像处理与分析函数.这个类型的函数主要用于实现一些基本的图像处理与分析功能,例如,图像平滑函数cvSm ooth 、S obel 算子cvS obel 、Canny 边缘分割函数cvCanny 等.2)结构分析函数.包括轮廓处理函数、几何学函数以及平面细分函数.712第3期齐金山:基于OpenC V 的人脸检测算法研究812淮阴师范学院学报(自然科学版)第8卷3)运动分析与目标跟踪函数.包括用于运动分析与目标跟踪的函数,例如,背景重建函数cvAcc,用光流法或动态轮廓模型实现目标跟踪的函数cvCalcOpticalFlow BM和cvSnakeImage以及卡尔曼滤波函数cvK alman等.4)摄像机标定和3D重建函数.包括用于摄像机标定、姿态估计以及两个摄像机进行3D相似重构的函数.5)G UI与视频处理函数.包括高级图形用户结构HighG UI用以实现对图像的载入、显示及保存等基本操作以及用以实现视频输入输出及处理的函数.根据上述的数据类型以及函数体系,程序开发者可以根据自己所开发应用程序要实现的功能来方便的选择所需的库函数.113 OpenC V在Visual C++2005下的安装与配置由于OpenCv的源代码是用C和C++所编写而且完全开放,因此可以在Visual C++2005环境下很方便地使用OpenCv所提供的库来进行图像处理.具体步骤如下:1)首先到OpenC V的官方网站(http://s /projects/opencvlibrary)下载OpenC V并进行安装,安装过程很简单,只要按照安装向导一步一步进行即可.2)安装结束后运行Micros oft Visual ,选择“项目”→属性,会弹出一个对话框,之后选择“C/C++”→常规→附加包含目录,在附加包含目录中加入下面路径(假设OpenCv安装在目录C:/Pro2 gram Files/OpenC V下):(i)C:/Program Files/0penC V/include(ii)C:/Program Files/OpenC V/otherlibs/highgui3)然后选择“链接器”→常规→附加库目录,在附加库目录中加入如下路径:C:/Program Files/ OpenC V/lib.4)最后选择“链接器”→输入→附加依赖项,加入如下几项:cxcore.lib cv.lib ml.lib highgui.lib cvaux.lib(用空格分隔).经过上述几个步骤的配置后,OpenCv库就已经链接到当前创建的项目中,之后在项目中就可以方便地使用OpenCv所提供的各种图像处理相关库函数来进行图像处理.2 基于OpenCV的人脸检测算法基于OpenC V的人脸检测主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示[7].本算法使用OpenC V中提供的“haarcascade frontalface alt.xml”文件存储的目标检测分类,用cv Load函数载入后,进行强制类型转换.OpenC V中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回.为简便起见,以下仅列出其一成员函数FaceDetect来实现人脸检测,并用矩形框标识,代码如下:CT Array<CRect>CFaceDetector::FaceDetect(CImage&ImageS ource) {long detected h=0,detected w=0;//[定义检测出的人脸图像的高和宽] CT Matrix<RG B TRIP LE>tem p image=ImageS ource.G et color image();//[获得原图像的彩色图像分量] long height=ImageS ource.G et image height();//[获取高度] long width=ImageS ource.G et image width();//[获取宽度] CvSize size; size.height=height; size.width=width; CvMemStorage3storage=cvCreateMemStorage(0);//[创建一个新的内存存储区,参数为0则采用默认设置] I pIImage 3img =cvCreateImage (size ,IP L DEPTH 8U ,3);//[创建一个I pIImage 图像数据结构进行处理] ImageS ource.G et color image ().ExportT o (img ->imageData );//[导出矩阵内容给I pIImage ] int scale =1; if (cascade )//[分类器不能为空] {CvSeq 3faces =cvHaarDetectObjects (img ,cascade ,storage ,111,2,C V H AAR DO C ANNY PRUNI NG,cvSize (40,40));//[检测函数] CvP oint pt1,pt2;//[人脸矩形的左上点和右下点] POI NT tm ppt1,tm ppt2; if (faces ->total ) detected face.C onstruction (faces ->total );//[给detected face[i ]分配空间,i 必须大于0,则从1开始] for (i =0;i <(faces ?faces ->total :0);i ++) { CvRect 3r =(CvRect 3)cvG etSeqE lem (faces ,i ); pt1.x =r ->x 3scale ; pt2.x =(r ->x +r ->width )3scale ; pt1.y =r ->y 3scale ; pt2.y =(r ->y +r ->height )3scale ; //[将CvP oint 转换成POI NT 类型] tm ppt1.x =pt1.x ; tm ppt1.y =pt1.y ; tm ppt2.x =pt2.x ; tm ppt2.y =pt2.y ; CRect rect (tm ppt1,tm ppt2); cvRectangle (img ,pt1,pt2,C V RG B (255,0,0),3,8,0);//[在img 中画出人脸矩形] //detected face.C onstruction (i +1);//[给detected face[i ]分配空间,i 必须大于0,则从1开始] detected face[i ]=rect ; } } CT Matrix <RG B TRIP LE >colorsrc ;//[建立临时变量进行数据中转] colorsrc.C onstruction (height ,width ); colorsrc.Im portFrom (img ->imageData ); ImageS ource.Im portFrom (colorsrc );//[img ->imagedata 不能做src 的Im portFrom 参数,只能通过矩阵进行中转] colorsrc.Destruction ();//[数据释放] cvReleaseMemStorage (&storage );//[将内存区域清空] cvReleaseImage (&img );//[将临时变量img 释放] return (detectedface );//[返回检测到的人脸]}算法的实验结果如图1,从图中可以看出我们通过调用函数FaceDetect ,可以实现不同角度下的人脸检测.3 结束语Intel 公司开发OpenCv 库,旨在建立一个完全开放的研究机构使其在图像处理及计算机视觉技术中912第3期齐金山:基于OpenC V 的人脸检测算法研究022淮阴师范学院学报(自然科学版)第8卷图1 程序运行范例得到更好的应用,它为用户提供了一整套的图像处理以及图像与模式分析函数,而且这些函数在Intel 的处理器下执行是最优的.另外结合Micros oft DirectX技术OpenCv可以对数字视频进行处理,用于实现人脸检测与识别、运动分析及环境的实时监控等.本文的基于OpenC V的人脸检测算法识别效果好、实时性好、检测速度快,其检测速度不逊于目前公布的最快的算法,它的简单实用性为我们下一步诸如人脸姿态分析以及人脸姿态仿真[8]等的研发打下了坚实的基础.参考文献:[1] 孙宁,邹采荣,赵力.人脸检测综述[J].电路与系统学报,2006,11(6):1012107.[2] 黎松,平西建,丁益洪.开放源代码的计算机视觉类库OpenCv的应用[J].计算机应用与软件,2005,22(8):1342136.[3] 林维训,潘纲,吴朝晖,等.脸部特征定位方法[J].中国图象图形学报,2003,8(8):8472859.[4] Y oshinobu Ebisawa,Y uji Nurikabe.Face P ose Estimation Based on3D Detection of Pupils and N ostrils[A].VECI MS2005IEEEInternational C on ference on Virtual Environments,Human2C om puter Inter faces,and Measurement Systems G iardini Nax os[C],I tay,2005.[5] Mathew ing the lntel OpenC V Library[M].Ebisawa:Pupils and N ostrils,2004.[6] 陈磊.计算机视觉类库OpenC V在VC中的应用[J].微计算机信息,2007,23(4):1692171.[7] 李全彬,孙巧榆,刘锦高,等.复杂背景和光照多变的人脸检测方法[J].计算机工程与应用,2009,45(8):22224.[8] 赵松,潘可,张培仁.型相关分析在人脸姿态估计中的应用[J].小型微型计算机系统,2009,5(5):9832987.According to OpenCV Person F aceExamination the C alculate W ay StudyQI Jin2shan(School of C om puter Science and T echnology,Huaiyin N ormal University,Huaian Jiangsu223300,Chian)Abstract: This text introduced a kind of calculator sense of vision database that opens a s ource code OpenCv and elaborated the characteristics and structure of that s oftware,and as to it’s at Visual C++under2005development environments of the allocation made expatiation,then put forward an according to OpenCv pers on face examination calculate way.The experiment expresses that that calculate way has to identify as a result effective and s olid sex g ood,examination speed quick characteristics.K ey w ords: OpenC V;pers ons face examines;I pIImage[责任编辑:李晓薇]。

相关主题