基于OpenCV的人脸检测.docx
- 文档编号:4879862
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:3.72MB
基于OpenCV的人脸检测.docx
《基于OpenCV的人脸检测.docx》由会员分享,可在线阅读,更多相关《基于OpenCV的人脸检测.docx(11页珍藏版)》请在冰豆网上搜索。
基于OpenCV的人脸检测
山东工商学院
信息与电子工程学院
数字图像处理
题目:
基于OpenCV的人脸检测
班级:
电子131
姓名:
XXXXXX
学号:
XXXXXXXX
指导教师:
XXXXXX
基于OpenCV的人脸检测
XXX
(山东工商学院信息与电子工程学院,山东烟台262000)
【摘要】:
通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库OpenCV进行人脸检测系统的设计,实现了对图像中的人脸检测。
此外,在OpenCV环境下实现了对一个简单的人脸检测系统软件的界面开发,该系统对人脸检测的速度较快,检测结果较为准确,可以作为其他人脸检测或人脸模式识别的系统的开发基础。
【关键词】:
人脸检测;OpenCV;Adaboost
FaceDetectionBasedonOpenCV
XXX
(ShandongTechnologyandBusinessUniversity,InstituteofInformationELEC,ShandongYantai262000)
【Abstract】:
AccordingtotheresearchofAdaboostalgorithmofFaceDetection,peoplemadeuseofthealgorithmsandcomputervisionclasslibraryOpenCVforthedesignoffacedetectionsystemandachievedthetargetofpictures.What’smoreintheenvironmentofOpenCV,itachievedthedevelopmentofsimpleFaceDetection.ThespeedofFaceDetectionisveryfastandthetestresultsareaccurate.Itcanbeusedasthedevelopmentfoundationofotherfacedetectionorfacepatternrecognitionsystem.
【Keywords】:
Facedetection;OpenCV;Adaboost
1、引言
随着计算机与数字信号处理技术的高速发展,人脸检测技术在众多领域得到广泛应用。
人脸检测技术是指在视频或图像中检测出现人脸位置、大小的过程。
作为人脸信息处理中的一项关键技术,人脸检测技术已经超出了其它人脸识别
模式的应用范畴,在视频处理,图像处理,身份验证,安全监测等方面有着重要的应用价值。
随着计算机语言算法的发展,近年来出现了大量的人脸检测的算法,其中,能够较好的解决人脸的检测速度与检测效果的算法,是在2001年由Paul
Viola和MichaelJones首先提出的Adaboost算法。
本系统就是基于openCV,利用Adaboost算法设计的一个简单的人脸检测系统,该系统能够快速、准确的检测到图像或视频中的人脸。
2、过程
1、Adaboost人脸检测算法
人体检测属模式识别范畴。
模式识别方法多种多样,模式识别系统的最终目标是要在表示空间和解释空间之间找到一种映射关系。
这种映射可以是一个分类,也可以是回归或者描述方案。
在这里,我们用分类来叙述。
分类方法总得来说可以分为两种:
监督学习和非监督学习。
后来又在前两者的基础上发展出了半监督学习方法,这种方法的本质仍属于监督学习。
对人脸检测的研究最初可以追溯到20世纪70年代,早期的研究方向与现在的研究方向与方法不同。
目前在实际中应用的人脸检测方法较为普遍的是基于Adaboost算法的方法。
Viola的人脸检测方法是一种基于积分图、级联分类检测器和Adaboost算法的方法,方法框架可以分为以下3大步骤:
(1)使用Haar-like特征表示人脸,使用“积分图”实现特征数值的快速计算;
(2)使用Adaboost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器;
(3)将得到的若干强分类器串联组成一个级联结构的层叠分类器,训练得到的强级联结构能有效地提高分类器的检测速度。
2、Haar-like特征
haar特征是基于灰度图,首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。
识别物体的时候,同样计算积分图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,以后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动到一个位置,即计算该窗口内的haar特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大于该阈值才可以通过进入下一轮筛选。
当通过分类器所有分类级的时候说明这个物体以大概率被识别。
常用的Haar-like特征有线性特征,边缘特征,中心特征。
图1Harr-like特征
特征值是指图像上两个或者多个形状大小相同的矩形内部所有像素灰度值之和的差值,例如在边缘特征中,特征值的计算公式为:
V=Sum白-Sum黑
3、积分图
由于训练样本通常有近万个,并且矩形特征的数量非常庞大,如果每次计算特征值都要统计矩形内所以像素之和,将会大大降低训练和检测的速度。
因此引入了一种新的图像表示方法——积分图像特征的特征值计算法,该方法只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。
这样只要遍历图像一次,就可以求得所有子窗口的特征值。
积分图[2]定义为:
其中I(x′,y′)为图像在点(x′,y′)处的像素值。
为了节约时间,减少重复计算,则图像I的积分图可按如下递推公式计算:
这样就可以进行任意矩形区域内像素积分运算。
由图像的积分图可快速地计算图像中任意矩形内所有像素灰度积分。
如图2所示,点1的积分图像的值为(其中Sum为求和):
图2特征和计算
同理,点2、点3、点4的积分图像分别为:
矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:
4、Adaboost算法基本原理
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。
将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
使用Adaboost分类器可以排除一些不必要的训练数据特征,并将关键放在关键的训练数据上面。
Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。
开始时,每个样本对应的权重是相同的,即其中n为样本个数,在此样本分布下训练出一弱分类器。
对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分类错的样本就被突出出来,从而得到一个新的样本分布。
在新的样本分布下,再次对弱分类器进行训练,得到弱分类器。
依次类推,经过T次循环,得到T个弱分类器,把这T个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。
Adaboost的具体算法如下:
设输入的n个训练样本为:
{(x1,y1),(x2,y2)......(xn,yn)},其中xi是输入训练样本,yi∈{0,1}分别表示正样本和负样本,其中正样本数为l,负样本数为m。
n=l+m,具体步骤如下:
初始化每个样本的权重;
对每个t=1,...,T(T为弱分类器的个数)
①把权重归一化为一个概率分布:
如此使得ωt为一个概率分布。
②对每个特征f,训练一个弱分类器hj,计算对应所有特征的弱分类器的加权错误率
③选取最佳的弱分类器ht(拥有最小错误率):
θt
④按照这个最佳弱分类器,调整权重:
其中θi=0表示被正确的分类,ei=1表示被错误的分类,当错误分类时:
最后的强分类器为:
其中
5、级联分类器
级联分类器是由多个强分类器级联而成的,其中,每一层均有Abadoost算法训练得到的强分类器构成,第一层分类器得到疑似人脸的正确结果后,触发第二层进行分类,当第二层分类器得到疑似人脸的正确结果后,触发第三层进行分类,依次类推,最后确定疑似人脸的图像就确认为人脸。
反之,当触发到某一层时,分类器得到的结果是非人脸时,就立即停止对图像的检测。
级联分类器的结构类似于金字塔,如图3所示,通过级联分类器,可以很对人脸做出检测。
由于本系统较为简单,所以只用到了4级强分类器构成级联分类器。
6、系统流程
基于静态图像的人脸检测流程大致可分为4个过程(如图5所示):
(1)加载已经训练好的分类器;
(2)将其转化为计算机可以识别的内部格式;
(3)加载该图片以进行检测;
(4)显示检测结果到检测区。
3、结果
1、
2、
结果表明:
基于OpenCV的简单的人脸检测系统,可以从静态图像中检测到人脸,并在检测区将人脸用不同颜色的椭圆标记,不过检测速度不是很快,而且也存在一定的误差,通过分析,发现产生误差的原因有多方面,其中与照片的分辨率,清晰程度都有很大的关系。
4、结论
本文简要阐述了在Adaboost人脸检测算法的基础上,采用级联分类器的方法检测静态图像中人脸,在检测区对人脸进行标记,结果显示,采用计算机视觉类库OpenCV实现基于Adaboost算法的人脸检测,具有检测速度较快,检测结果正确率较高。
通过这次课程设计学习了很多知识,例如OpenCV库函数的应用:
cvEqualizeHist(small_img,small_img),该函数的作用是对灰度图像直方图的均衡化,cvCvtColor(img,gray,CV_BGR2GRAY),该函数是对图像进行色彩转换,cvRectangle(img,LeftPoint,RightPoint,color,2,7,0),该函数实现对检测到的人脸区域用方框标记出来。
学习了VisualStudio2013软件的使用,不仅拓宽了自身的知识面,接触了一些比较前沿的知识,而且通过查资料和搜集有关的文献,培养了自学能力和动手能力,另外,强化了自己的编程能力,我相信这次经历会对自身未来的发展会起到很大作用,但是由于时间有限,本文只用了简单的人脸识别进行人脸检测,所以实际应用的话有较大限制同时也存在较多的问题,不管结果如何,这都是一次宝贵的经历。
最后,感谢马老师本学期的对我们的精心指导!
5、参考文献
[1]陈志恒,姜明新.基于openCV的人脸检测系统的设计[D].成都,电子科技大学,2012.
[2]黄文杰,陈斌.一种快速图像处理的积分方法[J].计算机应用,2005,25
(1):
266-268.
[3]崔晓青.基于AdaBoost算法的人脸检测人系统的研究与实现[D].长春:
吉林大学计算机科学与技术学院,2008.
[4]郭磊,王秋光.Adaboost人脸检测算法研究及OpenCV实现[J].哈尔滨理工大学学报,2009,14(5):
123-126.
[5]陈胜勇,刘胜.基于OpenCV的计算机视觉技术实现[M].北京:
科学出版社,2008.
[6]唐徙文,曾义.人脸检测级联分类器快速训练算法[J].计算机仿真,2007,24(12):
324-327.
[7]高建坡.视频序列中的人脸检测与跟踪算法研究.东南大学博士学位论文.2007,3.
6、源代码
#include
#include
#include
#include
usingnamespacestd;
constchar*pcascadeName="D:
\\ProgramFiles\\opencv\\sources\\data\\haarcascades\\
haarcascade_frontalface_alt.xml";
constchar*pImageName="jzh.png";
voidDetectAndMark();
intmain(intargc,constchar**argv)
{
DetectAndMark();
return0;
}
voidDetectAndMark()
{
//加载Haar特征检测分类器
CvHaarClassifierCascade*pHaarClassCascade;
pHaarClassCascade=(CvHaarClassifierCascade*)cvLoad(pcascadeName);
//加载图像
IplImage*pSrcImage=cvLoadImage(pImageName,CV_LOAD_IMAGE_UNCHANGED);
IplImage*pGrayImage=cvCreateImage(cvGetSize(pSrcImage),IPL_DEPTH_8U,1);
if(pSrcImage==NULL||pGrayImage==NULL)
{
printf("不能加载图像!
\n");
return;
}
cvCvtColor(pSrcImage,pGrayImage,CV_BGR2GRAY);
//人脸识别与标记
if(pHaarClassCascade!
=NULL&&pSrcImage!
=NULL&&pGrayImage!
=NULL)
{
conststaticCvScalarcolors[]=
{
CV_RGB(0,0,255),
CV_RGB(0,127,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,127,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)
};
CvMemStorage*pcvMemStorage=cvCreateMemStorage(0);
cvClearMemStorage(pcvMemStorage);
//检测人脸
intTimeStart,TimeEnd;
TimeStart=GetTickCount();
CvSeq*pcvSeqFaces=cvHaarDetectObjects(pGrayImage,pHaarClassCascade,pcvMemStorage);
TimeEnd=GetTickCount();
printf("人脸个数:
%d人\n",pcvSeqFaces->total);
printf("检测时间:
%dms\n",TimeEnd-TimeStart);
//标记人脸
for(inti=0;i
{
CvRect*r=(CvRect*)cvGetSeqElem(pcvSeqFaces,i);
CvPointcenter;
intradius;
center.x=cvRound((r->x+r->width*0.5));
center.y=cvRound((r->y+r->height*0.4));
radius=cvRound((r->width+r->height)*0.3);
cvCircle(pSrcImage,center,radius,colors[i%8],2);
}
cvReleaseMemStorage(&pcvMemStorage);
}
constchar*pstrWindowsTitle="人脸检测";
cvNamedWindow(pstrWindowsTitle,CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsTitle,pSrcImage);
cvWaitKey(0);
cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 OpenCV 检测