CvHaarClassifierCascade分类器文件进行人脸检测.doc_第1页
CvHaarClassifierCascade分类器文件进行人脸检测.doc_第2页
CvHaarClassifierCascade分类器文件进行人脸检测.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OpenCV 编程案例:读取CvHaarClassifierCascade 分类器文件进行人脸检测(facedetect) 在OpenCV 的sample 中,有一个人脸检测的案例程序facedetect。此程序要运行,共需要5 个文件: facedetect.cmd,程序执行入口,起到调用程序的批处理文件; haarcascade_frontalface_alt.xml,是使用cascade of boosted classifiers 对“人脸”前脸特征进行学习训练,所得到的分类器的参数; haarcascade_eye.xml,是使用cascade of boosted classifiers 对“人眼”特征进行学习训练,所得到的分类器的参数; facedetect.exe,是使用上述xml 文件,执行人脸检测的程序,其源码为facedetect.c。 当然,上面只是说要运行,而对于两 xml 数据文件的产生,则需要分类器的训练部分。此处先分析facedect 部分的源码。 首先,参考主调程序facedetect.cmd 的内容: 1. facedetect -cascade=././data/haarcascades/haarcascade_frontalface_alt.xml -nested-cascade=././data/haarcascades/haarcascade_eye.xml -scale=1.3 复制代码 此处可以看出,facedetect.exe 要执行需要另外的两个参数:-cascade=xxx 和 -nested-cascade=xxx。 haarcascade_frontalface_alt.xml 的内容形式如下(haarcascade_eye.xml 形式相同): 1. 2. 3. 20 20 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 3 7 14 4 -1. 15. 3 9 14 2 2. 16. 0 17. 4.0141958743333817e-003 18. 0.0337941907346249 19. 0.8378106951713562 20. 21. 22. 23. 24. 25. 26. 1 2 18 4 -1. 27. 7 2 6 4 3. 28. 0 29. 0.0151513395830989 30. 0.1514132022857666 31. 0.7488812208175659 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 0 0 10 6 -1. 42. 0 0 5 3 2. 43. 5 3 5 3 2. 44. 0 45. 0.0431624315679073 46. 0.4738228023052216 47. 0.6522961258888245 48. 105.7611007690429700 49. 20 50. -1 51.复制代码 上面文件形式,是由 OpenCV 的持久化和文件操作中提供的,输出格式xml 和yaml,在论坛前面几篇已经介绍,可以翻阅查看。 facedetect.c 的源码及注释如下: 1. #include cv.h 2. #include highgui.h 3. #include 4. #include 5. #include 6. #include 7. #include 8. #include 9. #include 10. #include 11. #include 12. #ifdef _EiC 13. #define WIN32 14. #endif 15. static CvMemStorage* storage = 0; 16. static CvHaarClassifierCascade* cascade = 0; 17. static CvHaarClassifierCascade* nested_cascade = 0; 18. int use_nested_cascade = 0; 19. void detect_and_draw( IplImage* image ); 20. const char* cascade_name = 21. ././data/haarcascades/haarcascade_frontalface_alt.xml; 22. /* haarcascade_profileface.xml;*/ 23. const char* nested_cascade_name = 24. ././data/haarcascades/haarcascade_eye_tree_eyeglasses.xml; 25. / ././data/haarcascades/haarcascade_eye.xml; 26. double scale = 1; 27. int main( int argc, char* argv ) 28. 29. CvCapture* capture = 0; 30. IplImage *frame, *frame_copy = 0; 31. IplImage *image = 0; 32. const char* scale_opt = -scale=; / 分类器选项指示符号 33. int scale_opt_len = (int)strlen(scale_opt); 34. const char* cascade_opt = -cascade=; 35. int cascade_opt_len = (int)strlen(cascade_opt); 36. const char* nested_cascade_opt = -nested-cascade; 37. int nested_cascade_opt_len = (int)strlen(nested_cascade_opt); 38. int i; 39. const char* input_name = 0; 40. for( i = 1; i argc; i+ ) / 从1 参数开始读取分类器选项参数,0 参数为函数命令自身 41. 42. if( strncmp( argvi, cascade_opt, cascade_opt_len) = 0 ) / 根据选项指示符号跟参数比对,构造存储分类器的文件名 43. cascade_name = argvi + cascade_opt_len; 44. else if( strncmp( argvi, nested_cascade_opt, nested_cascade_opt_len ) = 0 ) 45. 46. if( argvinested_cascade_opt_len = = ) 47. nested_cascade_name = argvi + nested_cascade_opt_len + 1; 48. nested_cascade = (CvHaarClassifierCascade*)cvLoad( nested_cascade_name, 0, 0, 0 ); / 加载分类器 49. if( !nested_cascade ) 50. fprintf( stderr, WARNING: Could not load classifier cascade for nested objectsn ); 51. 52. else if( strncmp( argvi, scale_opt, scale_opt_len ) = 0 ) 53. 54. if( !sscanf( argvi + scale_opt_len, %lf, &scale ) | scale width,frame-height), 99. IPL_DEPTH_8U, frame-nChannels ); 100. if( frame-origin = IPL_ORIGIN_TL ) 101. cvCopy( frame, frame_copy, 0 ); 102. else 103. cvFlip( frame, frame_copy, 0 ); 104. 105. detect_and_draw( frame_copy ); / 调用检测和绘制函数 106. if( cvWaitKey( 10 ) = 0 ) 107. goto _cleanup_; 108. 109. cvWaitKey(0); 110. _cleanup_: / 标记使用,在汇编里用过,C 语言,我还没见用过 111. cvReleaseImage( &frame_copy ); 112. cvReleaseCapture( &capture ); 113. 114. else 115. 116. if( image ) / 输入参数文件是图片 117. 118. detect_and_draw( image ); 119. cvWaitKey(0); 120. cvReleaseImage( &image ); 121. 122. else if( input_name ) / 输入参数是一个含有所有图片序列的文本文件,每行一个图像名 123. 124. /* assume it is a text file containing the 125. list of the image filenames to be processed - one per line */ 126. FILE* f = fopen( input_name, rt ); 127. if( f ) 128. 129. char buf1000+1; 130. while( fgets( buf, 1000, f ) ) / 按行,循环加载图像并处理 131. 132. int len = (int)strlen(buf), c; 133. while( len 0 & isspace(buflen-1) ) / 统计去除右空格的字符长度 134. len-; 135. buflen = 0; 136. printf( file %sn, buf ); 137. image = cvLoadImage( buf, 1 ); 138. if( image ) 139. 140. detect_and_draw( image ); 141. c = cvWaitKey(0); 142. if( c = 27 | c = q | c = Q ) 143. break; 144. cvReleaseImage( &image ); 145. 146. 147. fclose(f); 148. 149. 150. 151. 152. cvDestroyWindow(result); 153. return 0; 154. 155. void detect_and_draw( IplImage* img ) / 检测和绘画 156. 157. static CvScalar colors = 158. 159. 0,0,255, 160. 0,128,255, 161. 0,255,255, 162. 0,255,0, 163. 255,128,0, 164. 255,255,0, 165. 255,0,0, 166. 255,0,255 167. ; 168. IplImage *gray, *small_img; 169. int i, j; 170. gray = cvCreateImage( cvSize(img-width,img-height), 8, 1 ); 171. small_img = cvCreateImage( cvSize( cvRound (img-width/scale), 172. cvRound (img-height/scale), 8, 1 ); 173. cvCvtColor( img, gray, CV_BGR2GRAY ); / 彩色RGB 图像转为灰度图像 174. cvResize( gray, small_img, CV_INTER_LINEAR ); 175. cvEqualizeHist( small_img, small_img ); / 直方图均衡化 176. cvClearMemStorage( storage ); 177. if( cascade ) 178. 179. double t = (double)cvGetTickCount(); 180. CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 181. 1.1, 2, 0 182. /|CV_HAAR_FIND_BIGGEST_OBJECT 183. /|CV_HAAR_DO_ROUGH_SEARCH 184. |CV_HAAR_DO_CANNY_PRUNING 185. /|CV_HAAR_SCALE_IMAGE 186. , 187. cvSize(30, 30) ); 188. t = (double)cvGetTickCount() - t; / 统计检测使用时间 189. printf( detection time = %gmsn, t/(double)cvGetTickFrequency()*1000.) ); 190. for( i = 0; i total : 0); i+ ) 191. 192. CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); / 将faces 数据从CvSeq 转为CvRect 193. CvMat small_img_roi; 194. CvSeq* nested_objects; 195. CvPoint center; 196. CvScalar color = colorsi%8; / 使用不同颜色绘制各个face,共八种色 197. int radius; 198. center.x = cvRound(r-x + r-width*0.5)*scale); / 找出faces 中心 199. center.y = cvRound(r-y + r-height*0.5)*scale); 200. radius = cvRound(r-width + r-height)*0.25*scale); 201. cvCircle( img, center, radius, color, 3, 8, 0 ); / 从中心位置画圆,圈出脸部区域 202. if( !nested_cascade ) 203. continue; 204. cvGetSubRect( small_img, &small_img_roi, *r ); 205. nested

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论