人脸识别Step1在opencv下作人脸检测.docx
- 文档编号:11377545
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:17
- 大小:21.76KB
人脸识别Step1在opencv下作人脸检测.docx
《人脸识别Step1在opencv下作人脸检测.docx》由会员分享,可在线阅读,更多相关《人脸识别Step1在opencv下作人脸检测.docx(17页珍藏版)》请在冰豆网上搜索。
人脸识别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:
DetectFaces
#include
#include"cv.h"
#include"highgui.h"
//***Changethistoyourinstalllocation!
***
//*********************************************
#defineOPENCV_ROOT "C:
/ProgramFiles/OpenCV"
//*********************************************
voiddisplayDetections(IplImage*pInpImg,CvSeq*pFaceRectSeq,char*FileName);
intmain(intargc,char**argv)
{
//variables
IplImage*pInpImg=0;
CvHaarClassifierCascade*pCascade=0; //thefacedetector
CvMemStorage*pStorage=0; //memoryfordetectortouse
CvSeq*pFaceRectSeq; //memory-accessinterface
//usagecheck
if(argc<2)
{
printf("Missingnameofimagefile!
\n"
"Usage:
%s
exit(-1);
}
//initializations
pInpImg=(argc>1)?
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);
//validatethateverythinginitializedproperly
if(!
pInpImg||!
pStorage||!
pCascade)
{
printf("Initializationfailed:
%s\n",
(!
pInpImg)?
"can'tloadimagefile":
(!
pCascade)?
"can'tloadhaar-cascade--"
"makesurepathiscorrect":
"unabletoallocatememoryfordatastorage",argv[1]);
exit(-1);
}
//detectfacesinimage
pFaceRectSeq=cvHaarDetectObjects
(pInpImg,pCascade,pStorage,
1.1, //increasesearchscaleby10%eachpass
3, //mergegroupsofthreedetections
CV_HAAR_DO_CANNY_PRUNING, //skipregionsunlikelytocontainaface
cvSize(40,40)); //smallestsizefacetodetect=40x40
//displaydetectedfaces
displayDetections(pInpImg,pFaceRectSeq,argv[1]);
//cleanupandreleaseresources
cvReleaseImage(&pInpImg);
if(pCascade)cvReleaseHaarClassifierCascade(&pCascade);
if(pStorage)cvReleaseMemStorage(&pStorage);
return0;
}
voiddisplayDetections(IplImage*pInpImg,CvSeq*pFaceRectSeq,char*FileName)
{
constchar*DISPLAY_WINDOW="HaarWindow";
inti;
//createawindowtodisplaydetectedfaces
cvNamedWindow(DISPLAY_WINDOW,CV_WINDOW_AUTOSIZE);
//drawarectangularoutlinearoundeachdetection
for(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);
}
//displayfacedetections
cvShowImage(DISPLAY_WINDOW,pInpImg);
cvWaitKey(0);
cvDestroyWindow(DISPLAY_WINDOW);
}
程序会将人脸检测出来,显示在屏幕上,并存回原来的文件将其覆盖。
在windowxp,devcpp 4.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(r 每个新变量是原有变量的线性组合,体现原有变量的综合效果,具有一定的实际含义。 这r个新变量称为“主成分”,它们可以在很大程度上反映原来n个变量的影响,并且这些新变量是互不相关的,也是正交的。 通过主成分分析,压缩数据空间,将多元数据的特征在低维空间里直观地表示出来。 Opencv中,事先预置了PCA方法的函数,我们去调用即可。 在下面给出的程序中,我将训练集人脸图片的PCA结果输出到TrainFace.txt,测试人脸图片的PCA结果输出到TestFace.txt中,以备以后调用别的学习算法(如SVM等)使用。 在程序中,直接使用欧式距离或余弦距离(需要在源代码中手动更改编译)度量测试人脸和各训练人脸的相似度并输出,以供作简单的观察。 以下是源程序: //eigenface.c,byRobinHewitt,2007 //editedbyXinQIao,AUG2007 // //ExampleprogramshowinghowtoimplementeigenfacewithOpenCV //Usage: // //First,youneedsomefaceimages.IusedtheORLfacedatabase. //Youcandownloaditforfreeat // www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html // //Listthetrainingandtestfaceimagesyouwanttouseinthe //inputfilestrain.txtandtest.txt.(Exampleinputfilesareprovided //inthedownload.)Tousetheseinputfilesexactlyasprovided,unzip //theORLfacedatabase,andplacetrain.txt,test.txt,andeigenface.exe //attherootoftheunzippeddatabase. // //Torunthelearningphaseofeigenface,enter // eigenfacetrain //atthecommandprompt.Toruntherecognitionphase,enter // eigenfacetest #include #include #include #include"cv.h" #include"cvaux.h" #include"highgui.h" ////Globalvariables IplImage**faceImgArr =0;//arrayoffaceimages CvMat * personNumTruthMat=0;//arrayofpersonnumbers intnTrainFaces =0;//thenumberoftrainingimages intnEigens =0;//thenumberofeigenvalues IplImage*pAvgTrainImg =0;//theaverageimage IplImage**eigenVectArr =0;//eigenvectors CvMat*eigenValMat =0;//eigenvalues CvMat*projectedTrainFaceMat=0;//projectedtrainingfaces ////Functionprototypes voidlearn(); voidrecognize(); voiddoPCA(); voidstoreTrainingData(); int loadTrainingData(CvMat**pTrainPersonNumMat); double*findNearestNeighbor(float*projectedTestFace); int loadFaceImgArray(char*filename); voidprintUsage(); ////////////////////////////////// //main() // intmain(intargc,char**argv) { //validatethataninputwasspecified if(argc! =2) { printUsage(); return-1; } if(! strcmp(argv[1],"train"))learn(); elseif(! strcmp(argv[1],"test"))recognize(); else { printf("Unknowncommand: %s\n",argv[1]); printUsage(); } return0; } ////////////////////////////////// //learn() // voidlearn() { inti,j,k,offset; //loadtrainingdata nTrainFaces=loadFaceImgArray("train.txt"); if(nTrainFaces<2) { fprintf(stderr, "Need2ormoretrainingfaces\n" "Inputfilecontainsonly%d\n",nTrainFaces); return; } //doPCAonthetrainingfaces doPCA(); //projectthetrainingimagesontothePCAsubspace projectedTrainFaceMat=cvCreateMat(nTrainFaces,nEigens,CV_32FC1); offset=projectedTrainFaceMat->step/sizeof(float); for(i=0;i { //intoffset=i*nEigens; cvEigenDecomposite( faceImgArr, nEigens, eigenVectArr, 0,0, pAvgTrainImg, //projectedTrainFaceMat->data.fl+i*nEigens); projectedTrainFaceMat->data.fl+i*offset); } //storetheprojectedTrainFaceMatasTrainFace.txt FILE*TrainfaceFile=0; if(TrainfaceFile=fopen("TrainFace.txt","w")) { for(j=0;j fprintf(TrainfaceFile,"%d ",j); for(k=0;k fprintf(TrainfaceFile,"%d: %f",k,(projectedTrainFaceMat->data.fl+j*offset)[k]); } fprintf(TrainfaceFile,"-1: ? \n"); } } //storetherecognitiondataasanxmlfile storeTrainingData(); } ////////////////////////////////// //recognize() // voidrecognize() { inti,j,nTestFaces =0; //thenumberoftestimages CvMat*trainPersonNumMat=0; //thepersonnumbersduringtraining float*projectedTestFace=0; //loadtestimagesandgroundtruthforpersonnumber nTestFaces=loadFaceImgArray("test.txt"); printf("%dtestfacesloaded\n",nTestFaces); //loadthesavedtrainingdata if(! loadTrainingData(&trainPersonNumMat))return; //projectthetestimagesontothePCAsubspace projectedTestFace=(float*)cvAlloc(nEigens*sizeof(float)); double*sim=(double*)cvAlloc(nEigens*sizeof(double));; for(i=0;i { intiNearest,k; //intstar[nTrainFaces]; //projectthetestimageontothePCAsubspace cvEigenDecomposite( faceImgArr, nEigens, eigenVectArr, 0,0, pAvgTrainImg, projectedTestFace); //storetheprojectedTestFaceasTestFace.txt FILE*TestfaceFile=0; if(TestfaceFile=fopen("TestFace.txt","w")) { fprintf(TestfaceFile,"%d ",0); for(k=0;k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 识别 Step1 opencv 下作 检测