现在的位置: 首页 > 综合 > 正文

OpenCV:利用级联的haar分类器寻找检测目标

2018年05月13日 ⁄ 综合 ⁄ 共 1339字 ⁄ 字号 评论关闭
<span style="font-size:14px;">#include <opencv\cv.h>
#include <opencv\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;

    // 如果操作方式flags被指定,向下测量输入图像以得到性能的提高
    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 );
        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;
}
</span>

运行结果截图:

抱歉!评论已关闭.