基于opencv的人脸识别程序-代码详解

上传人:豆浆 文档编号:4079701 上传时间:2017-08-15 格式:DOC 页数:15 大小:98KB
返回 下载 相关 举报
基于opencv的人脸识别程序-代码详解_第1页
第1页 / 共15页
基于opencv的人脸识别程序-代码详解_第2页
第2页 / 共15页
基于opencv的人脸识别程序-代码详解_第3页
第3页 / 共15页
基于opencv的人脸识别程序-代码详解_第4页
第4页 / 共15页
基于opencv的人脸识别程序-代码详解_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《基于opencv的人脸识别程序-代码详解》由会员分享,可在线阅读,更多相关《基于opencv的人脸识别程序-代码详解(15页珍藏版)》请在金锄头文库上搜索。

1、#include cv.h#include highgui.h #include #ifdef _EiC#define WIN32#endifstatic CvMemStorage* storage = 0;static CvHaarClassifierCascade* cascade = 0;void detect_and_draw( IplImage* image );const char* cascade_name =haarcascade_frontalface_alt.xml;/人脸检测分类器int main( int argc, char* argv )CvCapture* cap

2、ture = 0;IplImage *frame, *frame_copy = 0;int optlen = strlen(-cascade=);const char* input_name;if( argc 1 & strncmp( argv1, -cascade=, optlen ) = 0 )cascade_name = argv1 + optlen;input_name = argc 2 ? argv2 : 0;elsecascade_name = E:毕业设计智能机器人动态人脸识别系统 陈建州程序 .xml;/分类器路径input_name = argc 1 ? argv1 : 0;

3、cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );if( !cascade )/如果没有找到分类器,输出以下fprintf( stderr, ERROR: Could not load classifier cascaden );fprintf( stderr,Usage: facedetect -cascade= filename|camera_indexn );return -1; storage = cvCreateMemStorage(0);capture = cvCaptureFromCAM( !i

4、nput_name ? 0 : input_name0 - 0 );/读取摄像头if(!capture)/如果没有摄像头读取视频文件capture = cvCaptureFromAVI(检测.avi); cvNamedWindow( result, 1);/创建窗口if( capture )for(;)if( !cvGrabFrame( capture )/从摄像头中抓取帧break;frame = cvRetrieveFrame( capture );/读取上边抓取的帧if( !frame )break;if( !frame_copy )frame_copy = cvCreateImage(

5、 cvSize(frame-width,frame-height),IPL_DEPTH_8U, frame-nChannels );if( frame-origin = IPL_ORIGIN_TL )cvCopy( frame, frame_copy, 0 );elsecvFlip( frame, frame_copy, 0 );detect_and_draw( frame_copy );if( cvWaitKey( 10 ) = 0 )break;cvReleaseImage( &frame_copy );cvReleaseCapture( &capture );else/没检测到视频文件或

6、者摄像头const char* filename = (char*)检测.jpg;/读图片IplImage* image = cvLoadImage( filename, 1 );if( image )detect_and_draw( image ); cvWaitKey(0);cvReleaseImage( &image );elseFILE* f = fopen( filename, rt );if( f )char buf1000+1;while( fgets( buf, 1000, f ) )int len = (int)strlen(buf);while( len 0 & isspa

7、ce(buflen-1) )len-;buflen = 0;image = cvLoadImage( buf, 1 );if( image )detect_and_draw( image );cvWaitKey(0);cvReleaseImage( &image );fclose(f);cvDestroyWindow(result);return 0;void detect_and_draw( IplImage* img )static CvScalar colors = 0,0,255,0,128,255,0,255,255,0,255,0,255,128,0, 255,255,0,255,

8、0,0,255,0,255;double scale = 1.3;IplImage* gray = cvCreateImage( cvSize(img-width,img-height), 8, 1 );IplImage* small_img = cvCreateImage( cvSize( cvRound (img-width/scale),cvRound (img-height/scale),8, 1 );int i;cvCvtColor( img, gray, CV_BGR2GRAY );cvResize( gray, small_img, CV_INTER_LINEAR );cvEqu

9、alizeHist( small_img, small_img );cvClearMemStorage( storage );if( cascade )double t = (double)cvGetTickCount();CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(30, 30) );/检测人脸返回矩形人脸t = (double)cvGetTickCount() - t;printf( detection time =

10、%gmsn, t/(double)cvGetTickFrequency()*1000.) );for( i = 0; i total : 0); i+ )/找到矩形中心,把矩形转化为圆形CvRect* r = (CvRect*)cvGetSeqElem( faces, i );CvPoint center;int radius;center.x = cvRound(r-x + r-width*0.5)*scale);center.y = cvRound(r-y + r-height*0.5)*scale);radius = cvRound(r-width + r-height)*0.25*sc

11、ale);cvCircle( img, center, radius, colorsi%8, 3, 8, 0 );cvShowImage( result, img );cvReleaseImage( &gray );cvReleaseImage( &small_img ); OpenCV 的人脸检测主要是调用训练好的 cascade(Haar 分类器)来进行模式匹配。 cvHaarDetectObjects,先将图像灰度化,根据传入参数判断是否进行 canny 边缘处理(默认不使用),再进行匹配。匹配后收集找出的匹配块 ,过滤噪声,计算相邻个数如果超过了规定值(传入的 min_neighbor

12、s)就当成输出结果,否则删去。匹配循环:将匹配分类器放大 scale(传入值)倍,同时原图缩小 scale 倍,进行匹配,直到匹配分类器的大小大于原图,则返回匹配结果。匹配的时候调用cvRunHaarClassifierCascade 来进行匹配,将所有结果存入 CvSeq* Seq (可动态增长元素序列) ,将结果传给 cvHaarDetectObjects。cvRunHaarClassifierCascade 函数整体是根据传入的图像和 cascade 来进行匹配。并且可以根据传入的 cascade 类型不同(树型、stump(不完整的树)或其他的) ,进行不同的匹配方式。函数 cvRun

13、HaarClassifierCascade 用于对单幅图片的检测。在函数调用前首先利用 cvSetImagesForHaarClassifierCascade 设定积分图和合适的比例系数 (= 窗口尺寸)。当分析的矩形框全部通过级联分类器每一层的时返回正值(这是一个候选目标) ,否则返回 0 或负值。为了了解 OpenCV 人脸检测中寻找匹配图像的详细过程,就把 cvHaarDetectObjects 和cvRunHaarClassifierCascade 的源文件详细看了一遍,并打上了注释。方便大家阅读。附 cvHaarDetectObjects 代码:CV_IMPL CvSeq*cvHaa

14、rDetectObjects( const CvArr* _img, CvHaarClassifierCascade* cascade,CvMemStorage* storage, double scale_factor,int min_neighbors, int flags, CvSize min_size )int split_stage = 2;CvMat stub, *img = (CvMat*)_img; /CvMat 多通道矩阵 *img=_img 指针代换传入图CvMat *temp = 0, *sum = 0, *tilted = 0, *sqsum = 0, *norm_i

15、mg = 0, *sumcanny = 0, *img_small = 0;CvSeq* seq = 0;CvSeq* seq2 = 0; /CvSeq 可动态增长元素序列CvSeq* idx_seq = 0;CvSeq* result_seq = 0;CvMemStorage* temp_storage = 0;CvAvgComp* comps = 0;int i; #ifdef _OPENMPCvSeq* seq_threadCV_MAX_THREADS = 0;int max_threads = 0;#endif CV_FUNCNAME( “cvHaarDetectObjects” );_BEGIN_;double factor;int npass = 2, coi;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号