[人脸识别Step1]在opencv下作人脸检测

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

[人脸识别Step1]在opencv下作人脸检测本帖被admin设置为精华(2007-08-03)人脸识别的第一步,就是人脸检测。把人的脸部从一张照片中用计算机自动识别出来,作为下一步人脸识别的基础。在opencv中,库中自带了一个利用harr特征的人脸检测训练及检测函数:cvHaarDetectObjects。它利用训练好的检测器,在图片中间检测你想要的物体,如人脸。opencv自带了很多检测器,在%opencv%data/haarcascades目录下,你可以随意取用。或者你也可以自己用图片训练自己的检测器,之后拿来使用。下面是检测人脸的源代码://DetectFaces.c////Examplecodeshowinghowtodetectfacesusing//OpenCV'sCvHaarClassifierCascade////Seealso,facedetect.c,inthesamplesdirectory.////Usage:DetectFacesimagefilename#includestdio.h#includecv.h#includehighgui.h//***Changethistoyourinstalllocation!***//*********************************************#defineOPENCV_ROOTC:/ProgramFiles/OpenCV//*********************************************voiddisplayDetections(IplImage*pInpImg,CvSeq*pFaceRectSeq,char*FileName);intmain(intargc,char**argv){//variablesIplImage*pInpImg=0;CvHaarClassifierCascade*pCascade=0;//thefacedetectorCvMemStorage*pStorage=0;//memoryfordetectortouseCvSeq*pFaceRectSeq;//memory-accessinterface//usagecheckif(argc2){printf(Missingnameofimagefile!\nUsage:%simagefilename\n,argv[0]);exit(-1);}//initializationspInpImg=(argc1)?cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR):0;pStorage=cvCreateMemStorage(0);pCascade=(CvHaarClassifierCascade*)cvLoad((OPENCV_ROOT/data/haarcascades/haarcascade_frontalface_default.xml),0,0,0);//validatethateverythinginitializedproperlyif(!pInpImg||!pStorage||!pCascade){printf(Initializationfailed:%s\n,(!pInpImg)?can'tloadimagefile:(!pCascade)?can'tloadhaar-cascade--makesurepathiscorrect:unabletoallocatememoryfordatastorage,argv[1]);exit(-1);}//detectfacesinimagepFaceRectSeq=cvHaarDetectObjects(pInpImg,pCascade,pStorage,1.1,//increasesearchscaleby10%eachpass3,//mergegroupsofthreedetectionsCV_HAAR_DO_CANNY_PRUNING,//skipregionsunlikelytocontainafacecvSize(40,40));//smallestsizefacetodetect=40x40//displaydetectedfacesdisplayDetections(pInpImg,pFaceRectSeq,argv[1]);//cleanupandreleaseresourcescvReleaseImage(&pInpImg);if(pCascade)cvReleaseHaarClassifierCascade(&pCascade);if(pStorage)cvReleaseMemStorage(&pStorage);return0;}voiddisplayDetections(IplImage*pInpImg,CvSeq*pFaceRectSeq,char*FileName){constchar*DISPLAY_WINDOW=HaarWindow;inti;//createawindowtodisplaydetectedfacescvNamedWindow(DISPLAY_WINDOW,CV_WINDOW_AUTOSIZE);//drawarectangularoutlinearoundeachdetectionfor(i=0;i(pFaceRectSeq?pFaceRectSeq-total:0);i++){CvRect*r=(CvRect*)cvGetSeqElem(pFaceRectSeq,i);CvPointpt1={r-x,r-y};CvPointpt2={r-x+r-width,r-y+r-height};cvRectangle(pInpImg,pt1,pt2,CV_RGB(0,255,0),3,4,0);cvSetImageROI(pInpImg,*r);//char*FileName=argv[1];IplImage*dst=cvCreateImage(cvSize(92,112),pInpImg-depth,pInpImg-nChannels);cvResize(pInpImg,dst,CV_INTER_LINEAR);strcat(FileName,.pgm);cvSaveImage(FileName,dst);}//displayfacedetectionscvShowImage(DISPLAY_WINDOW,pInpImg);cvWaitKey(0);cvDestroyWindow(DISPLAY_WINDOW);}程序会将人脸检测出来,显示在屏幕上,并存回原来的文件将其覆盖。在windowxp,devcpp4.9.9.2下编译通过。人脸识别Step2]对人脸图片作PCA降维本帖被admin设置为精华(2007-08-03)在上一篇文章中,我们将人脸从图片中检测了出来,并存回了同名的文件。下一步,就要进行识别了。对一幅图片而言,我们可以将它看成是一个二位数组,每个元素表达一个像素的特征,如颜色等。那么,对一幅我们处理好的大小为92*112的黑白单通道图片,就需要一个长度为10304的浮点箱量来表示。这么高维度的数据,处理起来计算代价很大,因为它将所有像素一视同仁,效果也不一定好。所以,我们对于人脸数据,采用了主成分分析(PrincipalComponentAnalysis,PCA)方法来做数据降维。那么,什么是PCA呢?主成分分析(PrincipalComponentAnalysis,PCA)是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。计算主成分的目的是将高维数据投影到较低维空间。给定n个变量的m个观察值,形成一个n′m的数据矩阵,n通常比较大。对于一个由多个变量描述的复杂事物,人们难以认识,那么是否可以抓住事物主要方面进行重点分析呢?如果事物的主要方面刚好体现在几个主要变量上,我们只需要将这几个变量分离出来,进行详细分析。但是,在一般情况下,并不能直接找出这样的关键变量。这时我们可以用原有变量的线性组合来表示事物的主要方面,PCA就是这样一种分析方法。PCA的目标是寻找r(rn)个新变量,使它们反映事物的主要特征,压缩原有数据矩阵的规模。每个新变量是原有变量的线性组合,体现原有变量的综合效果,具有一定的实际含义。这r个新变量称为“主成分”,它们可以在很大程度上反映原来n个变量的影响,并且这些新变量是互不相关的,也是正交的。通过主成分分析,压缩数据空间,将多元数据的特征在低维空间里直观地表示出来。Opencv中,事先预置了PCA方法的函数,我们去调用即可。在下面给出的程序中,我将训练集人脸图片的PCA结果输出到TrainFace.txt,测试人脸图片的PCA结果输出到TestFace.txt中,以备以后调用别的学习算法(如SVM等)使用。在程序中,直接使用欧式距离或余弦距离(需要在源代码中手动更改编译)度量测试人脸和各训练人脸的相似度并输出,以供作简单的观察。以下是源程序://eigenface.c,byRobinHewitt,2007//editedbyXinQIao,AUG2007////ExampleprogramshowinghowtoimplementeigenfacewithOpenCV//Usage:////First,youneedsomefaceimages.IusedtheORLfacedatabase.//Youcandownloaditforfreeat//(Exampleinputfilesareprovided//inthedownload.)Tousetheseinputfilesexactlyasprovided,unzip//theORLfacedatabase,andplacetrain.txt,test.txt,andeigenface.exe//attherootoftheunzippeddatabase.////Torunthelearningphaseofeigenface,enter//eigenfacetrain//atthecommandprompt.Toruntherecognitionphase,enter//eigenfacetest#includestdio.h#includestring.h#includemath.h#includecv.h#includecvaux.h#includehighgui.h////GlobalvariablesIplImage**faceImgArr=0;//arrayoffaceimagesCvMat*personNumTruthMat=0;//arrayofpersonnumbersintnTrainFaces=0;//thenumberoftrainingimagesintnEigens=0;//thenumberofeigenvaluesIplImage*pAvgTrainImg=0;//theaverageimageIplImage**eigenVectArr=0;//eigenvectorsCvMat*eigenValMat=0;//eigenvaluesCvMat*projectedTrainFaceMat=0;//projectedtrainingfaces////Functionprototypesvoidlearn();voidrecognize();voiddoPCA();voids

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功