1、人脸检测创新实验结题书编号: 数学与计算科学学院创新性实验结题报告书实验题目: 单张照片人脸检测 实验成绩(教师填写): 学 院: 数学与计算科学学院 专 业: 信息与计算科学 学生姓名: 韩尚颖 1200710218 小组成员: 覃启霞 1200710211 指导教师: 王东 2014 年 07月 25日摘 要: 人脸检测在计算机视觉领域是一个很基础性技术,我们组使用了基于openCV的Viola-Jones分类算法的haar 分类器的刚性物体检测技术;首先,需要使用openCV的createsamples()和haartraining()函数来训练分类器,然后使用detect_and_dr
2、aw()函数来进行人脸的检测和标记;本实验是在windows环境下使用win32 API和VC实现了人脸检测的基本功能。关键词: 人脸检测 openCV windows平台 Viola-Jones分类算法 haar 分类器1、实验目的及主要创新性点:1、熟悉和掌握openCV(open source computer vision library开源的计算机视觉库),并通过它提供的一些集成函数来实现对照片或视频的处理;2、实现照片的人脸检测,并且我们又加入了调用摄像头或者现成的视频文件进行人脸检测;3、同时进一步掌握了VC和win32编程的技巧和方法。二、实验要求:1、 实现单张照片的人脸检测
3、和标记;2、 熟悉怎么使用Windows API函数设计窗口界面,实现人脸检测功能;3、 了解Windows API 编程的方法与技能的; 4、 掌握VC和openCV的基础知识;3、实验原理: 一.人脸检测算法原理:Viola-Jones人脸检测方法 该算法的主要特征: 1.提出积分图像(integral image),从而可以快速计算Haar-like特征。 2.利用Adaboost学习算法进行特征选择和分类器训练,把弱分类器组 合成强分类器。 3.采用分类器级联提高效率。 二.openCV检测原理 因为openCV中已经有预先训练好的一些物体识别文件(haar 分类器),所以我们组决定不
4、在自己训练,因为这需要大量的经过处理的图片,任务过去繁重。 第二步,我们使用detect_and_draw()函数来识别、标记人脸,其中代码函数中有一个颜色向量的数组colors,可以不同颜色标记人脸;分类器在灰度图上进行检测,所以RGB图首先通过cvCvtClolor()转化成灰度图,还可以用cvResize()调整大小,然后通过cvEqualizeHist()进行直方均衡;cvHaarDetectObjects()以不同的窗口扫描输入的图形寻找人脸,人脸检测会有多次重复,这里默认3次,我们才认为人脸确实存在,防止误检验。主要步骤为: 1.加载分类器。 用cvLoad函数读入xml格式的文件
5、。 2.读入待检测图像。读入图片、视频或者调用摄像头采集。 3.检测并标示人脸,显示人脸检测数目和用时。四、实验内容与步骤(部分代码): 1、首先,在VS2010平台下建立win32 项目,设计基本对话框样式和功能按钮; (1)三个按钮: btn0 = CreateWindow(TEXT(button),TEXT(单张照片识别),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,40,40,100,30,hWnd,(HMENU)0,hInstance,NULL); btn1 = CreateWindow(TEXT(button),TEXT(摄像识别),WS_CHILD|WS_
6、VISIBLE|BS_PUSHBUTTON,40,80,100,30,hWnd,(HMENU)1,hInstance,NULL); btn2 = CreateWindow(TEXT(button),TEXT(视频识别),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,40,120,100,30,hWnd,(HMENU)2,hInstance,NULL); (2)显示人脸识别数和用时: TextOut(hdc,250,180,TEXT(人脸识别用时(纳秒):),11); TextOut(hdc, 400,180, szText1, wsprintf(szText1, TEXT
7、(%d), ti); TextOut(hdc,250,200,TEXT(人脸识别个数:),7); TextOut(hdc, 380,200, szText1, wsprintf(szText1, TEXT(%d), fa); 2、编写对应按钮的功能函数,加入openCV函数;const char* cascade_name = haarcascade_frontalface_alt2.xml;/Haar分类器/* haarcascade_profileface.xml;*/(1)人脸检测标记函数void detect_and_draw( IplImage* img )/人脸检测标记函数 sta
8、tic 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),/对
9、一个double型的数进行四舍五入,并返回一个整型数! cvRound (img-height/scale), 8, 1 );/缩放 int i; cvCvtColor( img, gray, CV_BGR2GRAY );/颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。 cvResize( gray, small_img, CV_INTER_LINEAR );/调整3通道图像(如RGB图像)和单通道图像的大小。 cvEqualizeHist( small_img, small_img );/用来使灰度图象直方图均衡化 cvClearMemStora
10、ge( storage ); if( cascade ) double t = (double)cvGetTickCount();/获取操作系统启动所经过(elapsed)的毫秒数 CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, /用来检测图像中的目标 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,/利用Canny边缘检测器 cvSize(20, 20) ); t = (double)cvGetTickCount() - t; ti=(t/(double)cvGetTickFrequ
11、ency()/1000000.0); fa=faces-total; 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*scale); cvCi
12、rcle( img, center, radius, colorsi%8, 3, 8, 0 ); /画圆标记 cvWaitKey(0); cvShowImage( 人脸检测结果, img ); cvReleaseImage( &gray ); cvReleaseImage( &small_img );/将TCHAR转为char /*tchar是TCHAR类型指针,*_char是char类型指针 void TcharToChar (const TCHAR * tchar, char * _char) int iLength ; /获取字节长度 iLength = WideCharToMultiB
13、yte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL); /将tchar值赋给_char WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength, NULL, NULL); (2)照片识别void picturetext (TCHAR a)/照片识别 CHAR b260; TcharToChar(a,b); /CvCapture* capture = 0;/视频摄像头 IplImage *frame, *frame_copy = 0;/图形结构 cascade = (CvHaarClassifier
14、Cascade*)cvLoad( cascade_name, 0, 0, 0 ); /导入分类器 storage = cvCreateMemStorage(0); /创建内存空间 cvNamedWindow( result, 1 ); const char* filename = (char*)b; IplImage* image = cvLoadImage( filename, 1 ); if( image ) detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); else /* assume it is a te
15、xt file containing the list of the image filenames to be processed - one per line */ FILE* f = fopen( filename, rt ); if( f ) char buf1000+1; while( fgets( buf, 1000, f ) ) int len = (int)strlen(buf); while( len 0 & isspace(buflen-1) ) /检查参数c是否为空格字符,也就是判断是否为空格( )、水平定位字符 /(t)、归位键(r)、换行(n)、垂直定位字符(v)或翻
16、页(f)的情况 len-; buflen = 0; image = cvLoadImage( buf, 1 ); if( image ) detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); fclose(f); cvDestroyWindow(result); (3)视频文件和摄像头识别我们组在照片识别的基础上进一步实现了摄像头捕获视频和读取视频文件(*.avi)的人脸检测:void camera_vedio()/视频文件和摄像头识别 CvCapture* capture = 0;/视频摄像头 /IplImage
17、*frame, *frame_copy = 0;/图形结构 cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); storage = cvCreateMemStorage(0); cvNamedWindow( result, 1 ); capture = cvCaptureFromCAM(0);/初始化从摄像头中获取视频 capture = cvCaptureFromAVI( input_name ); /从视频文件中捕获视频帧。*/ /二选一既可做识别 for(;) if( !cvGrabFrame( cap
18、ture )/从摄像头或者视频文件中抓取帧 break; frame = cvRetrieveFrame( capture );/取回由函数cvGrabFrame抓取的图像。 if( !frame ) break; 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 cvF
19、lip( frame, frame_copy, 0 );/直接将图像采集卡采集的图像cvShowImage出来的是反着的图像, /在显示图像之前使用cvFlip()函数将图像翻转一下 /垂直翻转图像(flip_mode = 0)用于 顶-左和底-左图像结构的转换, 主要用于WIN32系统下的视频操作处理. detect_and_draw( frame_copy );/人脸检测 if( cvWaitKey( 10000 ) = 27 ) /ESC键退出 break; cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); cvDe
20、stroyWindow(result); 3、选择检测图片、视频文件、调用摄像头获取视频文件进行人脸检测。5、实验过程原始记录(数据,图表,计算等): 主页面:1.照片识别结果:在这两张测试图片中,人脸检测准确率达到了100%。2.视频文件识别结果:在视频测试中准确率也达到了100%。3.调用摄像头识别结果:(1).在光线明亮处识别结果:准确识别,没有误差。(2).在光线较暗处识别结果:准确无误。六、实验结果分析或总结: 我们小组经过不懈的努力,最终实现了人脸检测的功能,我们知道Viola-Jones分类算法并不限于人脸检测,它适应于其他外表有区别的(接近刚性的)物体的检测。但是,人的侧脸和车
21、的斜视角检测效果不够理想,主要是因为这些视角在模板中有很多变化,而“块特征”无法很好地处理这些变化。通过本次实验,我们熟悉和掌握openCV(开源的计算机视觉库),并进一步增强了c语言和win32 编程能力;近几年,计算机视觉领域发展迅速,对一些物体的识别检测应用广泛,例如人脸识别出入管理系统、汽车识别系统、人脸识别门禁考勤系统、 人脸识别监控管理、人脸识别电脑安全防范、人脸识别照片搜索、人脸识别来防登记、人脸识别ATM机智能视频报警系统、人脸识别监狱智能报警系统、人脸识别RFID智能通关系统、人脸识别公安罪犯追逃智能报警系统等等。我们需要进一步研究openCV的使用,进一步提升自己在识别方面的开发能力,下一步准备做人脸识别电脑安全防范和门禁考勤系统,我们会更加努力!参考文献:1谭浩强.C程序设计(第4版) M 清华大学出版社2 Windows程序设计(第五版珍藏版)M 清华大学出版社3于仕琪等译.学习OpenCV(中文版) M 清华大学出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1