首页 文章

为什么我的haar分类器慢?

提问于
浏览
1

我训练了一个HAAR分类器来检测网络摄像头的实时视频中的手 . 我使用了621个阳性和3712个阴性 .

我使用opencv_createsamples生成肯定的vec文件:./ opencv_createsamples -vec /Users/.../positivesvec.vec -info /Users/.../positiveDesc.txt -w 20 -h 30

然后,我使用opencv_traincascade训练分类器:opencv_traincascade -data /Users/.../hand -vec /Users/.../positivesvec.vec -bg /Users/.../negativeDesc.txt -numPos 621 - numNeg 3712 -numStages 15 minHitRate 0.999 maxFalseAlarmRate 0.5 -w 20 -h 30 -mode ALL

培训大约需要30个小时左右,我得到了一个xml文件 . 但是,当我使用该xml文件进行检测时,它确实非常慢(可能在3-4秒内有1帧) .

我知道我的物体检测代码是正确的,因为它适用于脸部 . 这是我使用的:

trained_cascade_name = "/Users/.../cascade.xml";
if( !cascade.load( trained_cascade_name ) ){ qDebug()<<"Error loading cascade file!"; return; };
std::vector<Rect> hands;
    Mat frame_gray; // Haar works on grayscale images
    cvtColor(frame, frame_gray, CV_RGB2GRAY);
    equalizeHist(frame_gray, frame_gray);

    cascade.detectMultiScale( frame_gray, hands, 1.1, 3, 0|CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_FIND_BIGGEST_OBJECT, cv::Size(30,30),cv::Size(100,100));
    CvPoint topleft, bottomright;
    for( int i = 0; i < hands.size(); i++ )
      {
        topleft.x=hands[i].x;
        topleft.y=hands[i].y;
        bottomright.x=hands[i].x+hands[i].width;
        bottomright.y=hands[i].y+hands[i].height;
        cv::rectangle(frame, topleft, bottomright, Scalar(255,0,255), 1, 8, 0);
      }

2 回答

  • 1

    对于不同的物体,每个阶段产生不同数量的树木/树桩,以便拒绝50%的误报 .

    选择任何地区并对其进行分类 . 在此过程中,检查在较低阶段调用的树/树桩数量 .

    也许你的级联每个阶段只有更多的树/树桩,因此它花费更多的时间来对一个区域进行分类 .

    这只是一个疯狂的猜测......

  • 0

    你可以为scaleFactor设置一个更高的值,你有1.1,如果你设置得更高它可能运行得更快,但它也会错过一些检测 .

相关问题