OpenCV学习笔记(三)人脸检测的代码分析(2)

转自:http://www.rosoo.net/a/201009/10208_2.html
cvRunHaarClassifierCascade 在给定位置的图像中运行 cascade of boosted classifier int cvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade, CvPoint pt, int start_stage=0 ); cascade Haar 级联分
TAG:  OpenCV   人脸检测  

cvRunHaarClassifierCascade
在给定位置的图像中运行 cascade of boosted classifier 
int cvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade,
                                CvPoint pt, int start_stage=0 );
cascade Haar 级联分类器 
pt 待检测区域的左上角坐标。待检测区域大小为原始窗口尺寸乘以当前设定的比例系数。当前窗口尺寸可以通过cvGetHaarClassifierCascadeWindowSize重新得到。 
start_stage 级联层的初始下标值(从0开始计数)。函数假定前面所有每层的分类器都已通过。这个特征通过函数cvHaarDetectObjects内部调用,用于更好的处理器高速缓冲存储器。 
函 数 cvRunHaarHaarClassifierCascade 用于对单幅图片的检测。在函数调用前首先利用 cvSetImagesForHaarClassifierCascade设定积分图和合适的比例系数 (=> 窗口尺寸)。当分析的矩形框全部通过级联分类器每一层的时返回正值(这是一个候选目标),否则返回0或负值。
二、例程分析:
例子:利用级联的Haar classifiers寻找检测目标(e.g. faces).
       
       
       
       
  1. #include "cv.h" 
  2. #include "highgui.h" 
  3. //读取训练好的分类器。 
  4. CvHaarClassifierCascade* load_object_detector( const char* cascade_path ) 
  5.     return (CvHaarClassifierCascade*)cvLoad( cascade_path ); 
  6.  
  7. void detect_and_draw_objects( IplImage* image, 
  8.                               CvHaarClassifierCascade* cascade, 
  9.                               int do_pyramids ) 
  10.     IplImage* small_image = image; 
  11.     CvMemStorage* storage = cvCreateMemStorage(0); //创建动态内存 
  12.     CvSeq* faces; 
  13.     int i, scale = 1; 
  14.     /* if the flag is specified, down-scale the 输入图像 to get a 
  15.        performance boost w/o loosing quality (perhaps) */ 
  16.     if( do_pyramids ) 
  17.     { 
  18. small_image = cvCreateImage( cvSize(image->width/2,image->height/2),
  19.  IPL_DEPTH_8U, 3 ); 
  20. cvPyrDown( image, small_image, CV_GAUSSIAN_5x5 );
  21. //函数 cvPyrDown 使用 Gaussian 金字塔分解对输入图像向下采样。
  22. //首先它对输入图像用指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像。 
  23.         scale = 2; 
  24.     } 
  25.     /* use the fastest variant */ 
  26.     faces = cvHaarDetectObjects( small_image, cascade, storage,
  27.  1.2, 2, CV_HAAR_DO_CANNY_PRUNING ); 
  28.     /* draw all the rectangles */ 
  29.     for( i = 0; i < faces->total; i++ ) 
  30.     { 
  31.         /* extract the rectanlges only */ 
  32.         CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i, 0 ); 
  33.         cvRectangle( image, cvPoint(face_rect.x*scale,face_rect.y*scale), 
  34.                      cvPoint((face_rect.x+face_rect.width)*scale, 
  35.                              (face_rect.y+face_rect.height)*scale), 
  36.                      CV_RGB(255,0,0), 3 ); 
  37.     } 
  38.     if( small_image != image ) 
  39.         cvReleaseImage( &small_image ); 
  40.     cvReleaseMemStorage( &storage );  //释放动态内存 
  41. /* takes image filename and cascade path from the command line */ 
  42. int main( int argc, char** argv ) 
  43.     IplImage* image; 
  44.     if( argc==3 && (image = cvLoadImage( argv[1], 1 )) != 0 ) 
  45.     { 
  46.         CvHaarClassifierCascade* cascade = load_object_detector(argv[2]); 
  47.         detect_and_draw_objects( image, cascade, 1 ); 
  48.         cvNamedWindow( "test", 0 ); 
  49.         cvShowImage( "test", image ); 
  50.         cvWaitKey(0); 
  51.         cvReleaseHaarClassifierCascade( &cascade ); 
  52.         cvReleaseImage( &image ); 
  53.     } 
  54.     return 0; 

关键代码很简单,装载分类器,对输入图像进行金字塔采样,然后用cv的函数进行检测目标,最后输出检测到的目标矩形。

你可能感兴趣的:(OpenCV学习笔记(三)人脸检测的代码分析(2))