欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:29252489       资源大小:22.05KB        全文页数:20页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    1、基于opencv的人脸识别程序代码详解#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*

    2、argv ) CvCapture* capture = 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; else cascade_name = E:毕业设计智能机器人动态人脸识别系统陈建州程序 .xml;/分类器路径 inp

    3、ut_name = argc 1 ? argv1 : 0; 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 = cvCreateMemStorag

    4、e(0); capture = cvCaptureFromCAM( !input_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

    5、; if( !frame_copy ) frame_copy = cvCreateImage( cvSize(frame-width,frame-height), IPL_DEPTH_8U, frame-nChannels ); if( frame-origin = IPL_ORIGIN_TL ) cvCopy( frame, frame_copy, 0 ); else cvFlip( frame, frame_copy, 0 ); detect_and_draw( frame_copy ); if( cvWaitKey( 10 ) = 0 ) break; cvReleaseImage( &

    6、frame_copy ); cvReleaseCapture( &capture ); else/没检测到视频文件或者摄像头 const char* filename = (char*)检测.jpg;/读图片 IplImage* image = cvLoadImage( filename, 1 ); if( image ) detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); else FILE* f = fopen( filename, rt ); if( f ) char buf1000+1; while( fg

    7、ets( buf, 1000, f ) ) int len = (int)strlen(buf); while( len 0 & isspace(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 ) stati

    8、c CvScalar colors = 0,0,255, 0,128,255, 0,255,255, 0,255,0, 255,128,0, 255,255,0, 255,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 );

    9、 int i; cvCvtColor( img, gray, CV_BGR2GRAY ); cvResize( gray, small_img, CV_INTER_LINEAR ); cvEqualizeHist( 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_

    10、CANNY_PRUNING*/, cvSize(30, 30) );/检测人脸返回矩形人脸 t = (double)cvGetTickCount() - t; printf( detection time = %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 +

    11、r-width*0.5)*scale); center.y = cvRound(r-y + r-height*0.5)*scale); radius = cvRound(r-width + r-height)*0.25*scale); cvCircle( img, center, radius, colorsi%8, 3, 8, 0 ); cvShowImage( result, img ); cvReleaseImage( &gray ); cvReleaseImage( &small_img ); OpenCV的人脸检测主要是调用训练好的cascade(Haar分类器)来进行模式匹配。 c

    12、vHaarDetectObjects,先将图像灰度化,根据传入参数判断是否进行canny边缘处理(默认不使用),再进行匹配。匹配后收集找出的匹配块,过滤噪声,计算相邻个数如果超过了规定值(传入的min_neighbors)就当成输出结果,否则删去。匹配循环:将匹配分类器放大scale(传入值)倍,同时原图缩小scale倍,进行匹配,直到匹配分类器的大小大于原图,则返回匹配结果。匹配的时候调用cvRunHaarClassifierCascade来进行匹配,将所有结果存入CvSeq* Seq (可动态增长元素序列),将结果传给cvHaarDetectObjects。cvRunHaarClassif

    13、ierCascade函数整体是根据传入的图像和cascade来进行匹配。并且可以根据传入的cascade类型不同(树型、stump(不完整的树)或其他的),进行不同的匹配方式。函数 cvRunHaarClassifierCascade 用于对单幅图片的检测。在函数调用前首先利用 cvSetImagesForHaarClassifierCascade设定积分图和合适的比例系数 (= 窗口尺寸)。当分析的矩形框全部通过级联分类器每一层的时返回正值(这是一个候选目标),否则返回0或负值。为了了解OpenCV人脸检测中寻找匹配图像的详细过程,就把cvHaarDetectObjects和cvRunHaa

    14、rClassifierCascade的源文件详细看了一遍,并打上了注释。方便大家阅读。附cvHaarDetectObjects代码:CV_IMPL CvSeq*cvHaarDetectObjects( 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;

    15、/CvMat多通道矩阵 *img=_img指针代换传入图 CvMat *temp = 0, *sum = 0, *tilted = 0, *sqsum = 0, *norm_img = 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 _OPENMP CvSeq

    16、* seq_threadCV_MAX_THREADS = 0; int max_threads = 0;#endif CV_FUNCNAME( “cvHaarDetectObjects” ); _BEGIN_; double factor; int npass = 2, coi; /npass=2 int do_canny_pruning = flags & CV_HAAR_DO_CANNY_PRUNING; /true做canny边缘处理 if( !CV_IS_HAAR_CLASSIFIER(cascade) ) CV_ERROR( !cascade ? CV_StsNullPtr : CV

    17、_StsBadArg, “Invalid classifier cascade” ); if( !storage ) CV_ERROR( CV_StsNullPtr, “Null storage pointer” ); CV_CALL( img = cvGetMat( img, &stub, &coi ); if( coi ) CV_ERROR( CV_BadCOI, “COI is not supported” ); /一些出错代码 if( CV_MAT_DEPTH(img-type) != CV_8U ) CV_ERROR( CV_StsUnsupportedFormat, “Only 8

    18、-bit images are supported” ); CV_CALL( temp = cvCreateMat( img-rows, img-cols, CV_8UC1 ); CV_CALL( sum = cvCreateMat( img-rows + 1, img-cols + 1, CV_32SC1 ); CV_CALL( sqsum = cvCreateMat( img-rows + 1, img-cols + 1, CV_64FC1 ); CV_CALL( temp_storage = cvCreateChildMemStorage( storage );#ifdef _OPENM

    19、P max_threads = cvGetNumThreads(); for( i = 0; i hid_cascade ) CV_CALL( icvCreateHidHaarClassifierCascade(cascade) ); if( cascade-hid_cascade-has_tilted_features ) tilted = cvCreateMat( img-rows + 1, img-cols + 1, CV_32SC1 ); /多通道矩阵 图像长宽+1 4通道 seq = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvRect), tem

    20、p_storage ); /创建序列seq 矩形 seq2 = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvAvgComp), temp_storage ); /创建序列seq2 矩形和邻近 result_seq = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvAvgComp), storage ); /创建序列result_seq 矩形和邻近 if( min_neighbors = 0 ) seq = result_seq; if( CV_MAT_CN(img-type) 1 ) cvCvtColor( img, tem

    21、p, CV_BGR2GRAY ); /img转为灰度 img = temp; if( flags & CV_HAAR_SCALE_IMAGE ) /flag & 匹配图 CvSize win_size0 = cascade-orig_window_size; /CvSize win_size0为分类器的原始大小 int use_ipp = cascade-hid_cascade-ipp_stages != 0 & icvApplyHaarClassifier_32s32f_C1R_p != 0; /IPP相关函数 if( use_ipp ) CV_CALL( norm_img = cvCrea

    22、teMat( img-rows, img-cols, CV_32FC1 ); /图像的矩阵化 4通道. CV_CALL( img_small = cvCreateMat( img-rows + 1, img-cols + 1, CV_8UC1 ); /小图矩阵化 单通道 长宽+1 for( factor = 1; ; factor *= scale_factor ) /成scale_factor倍数匹配 int positive = 0; int x, y; CvSize win_size = cvRound(win_size0.width*factor), cvRound(win_size0

    23、.height*factor) ; /winsize 分类器行列(扩大factor倍) CvSize sz = cvRound( img-cols/factor ), cvRound( img-rows/factor ) ; /sz 图像行列(缩小factor倍) 三个Cvsize CvSize sz1 = sz.width win_size0.width, sz.height win_size0.height ; /sz1 图像 减 分类器行列 CvRect rect1 = icv_object_win_border, icv_object_win_border, win_size0.wid

    24、th icv_object_win_border*2, /icv_object_win_border (int) 初始值=1 win_size0.height icv_object_win_border*2 ; /矩形框rect1 CvMat img1, sum1, sqsum1, norm1, tilted1, mask1; /多通道矩阵 CvMat* _tilted = 0; if( sz1.width = 0 | sz1.height 跳出 break; if( win_size.width min_size.width | win_size.height 继续 continue;/CV

    25、_8UC1见定义./#define CV_MAKETYPE(depth,cn) (depth) + (cn)-1) data.ptr ); /小图的矩阵化 img1 单通道 sum1 = cvMat( sz.height+1, sz.width+1, CV_32SC1, sum-data.ptr ); /长宽+1 4通道8位 多通道矩阵 sqsum1 = cvMat( sz.height+1, sz.width+1, CV_64FC1, sqsum-data.ptr ); /长宽+1 4通道16位 if( tilted ) tilted1 = cvMat( sz.height+1, sz.wi

    26、dth+1, CV_32SC1, tilted-data.ptr ); /长宽+1 4通道8位 _tilted = &tilted1; /长宽+1 4通道8位 norm1 = cvMat( sz1.height, sz1.width, CV_32FC1, norm_img ? norm_img-data.ptr : 0 ); /norm1 图像 减 分类器行列 4通道 mask1 = cvMat( sz1.height, sz1.width, CV_8UC1, temp-data.ptr ); /mask1 灰度图 cvResize( img, &img1, CV_INTER_LINEAR )

    27、; /img双线性插值 输出到img1 cvIntegral( &img1, &sum1, &sqsum1, _tilted ); /计算积分图像 if( use_ipp & icvRectStdDev_32s32f_C1R_p( sum1.data.i, sum1.step, sqsum1.data.db, sqsum1.step, norm1.data.fl, norm1.step, sz1, rect1 ) positive cvSet( &mask1, cvScalarAll(255) ); /mask1赋值为255 for( i = 0; i count; i+ ) if( icvA

    28、pplyHaarClassifier_32s32f_C1R_p(sum1.data.i, sum1.step, norm1.data.fl, norm1.step, mask1.data.ptr, mask1.step, sz1, &positive, cascade-hid_cascade-stage_classifieri.threshold, cascade-hid_cascade-ipp_stagesi) 0 ) use_ipp = 0; /ipp=false; break; if( positive = 0 ) break; if( !use_ipp ) /如果ipp=false cvSetImagesForHaarClassifierCascade( c


    注意事项

    本文(基于opencv的人脸识别程序代码详解.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开