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).
- #include "cv.h"
- #include "highgui.h"
-
- CvHaarClassifierCascade* load_object_detector( const char* cascade_path )
- {
- return (CvHaarClassifierCascade*)cvLoad( cascade_path );
- }
-
- void detect_and_draw_objects( IplImage* image,
- CvHaarClassifierCascade* cascade,
- int do_pyramids )
- {
- IplImage* small_image = image;
- CvMemStorage* storage = cvCreateMemStorage(0);
- CvSeq* faces;
- int i, scale = 1;
-
-
- if( do_pyramids )
- {
- small_image = cvCreateImage( cvSize(image->width/2,image->height/2),
- IPL_DEPTH_8U, 3 );
- cvPyrDown( image, small_image, CV_GAUSSIAN_5x5 );
-
- scale = 2;
- }
-
- faces = cvHaarDetectObjects( small_image, cascade, storage,
- 1.2, 2, CV_HAAR_DO_CANNY_PRUNING );
-
- for( i = 0; i < faces->total; i++ )
- {
-
- CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i, 0 );
- cvRectangle( image, cvPoint(face_rect.x*scale,face_rect.y*scale),
- cvPoint((face_rect.x+face_rect.width)*scale,
- (face_rect.y+face_rect.height)*scale),
- CV_RGB(255,0,0), 3 );
- }
- if( small_image != image )
- cvReleaseImage( &small_image );
- cvReleaseMemStorage( &storage );
- }
-
- int main( int argc, char** argv )
- {
- IplImage* image;
- if( argc==3 && (image = cvLoadImage( argv[1], 1 )) != 0 )
- {
- CvHaarClassifierCascade* cascade = load_object_detector(argv[2]);
- detect_and_draw_objects( image, cascade, 1 );
- cvNamedWindow( "test", 0 );
- cvShowImage( "test", image );
- cvWaitKey(0);
- cvReleaseHaarClassifierCascade( &cascade );
- cvReleaseImage( &image );
- }
- return 0;
- }
关键代码很简单,装载分类器,对输入图像进行金字塔采样,然后用cv的函数进行检测目标,最后输出检测到的目标矩形。
(yangwu007) |