HOG + SVM Opencv检测对象的矩形

时间:2016-02-02 11:41:29

标签: c++ opencv

我想使用矩形进行对象检测,但首先我想了解代码。这是一个示例代码:

vector<Rect> found, found_filtered;
    size_t i, j;

    hog.detectMultiScale(mGray, found, 0, Size(8,8), Size(32,32), 1.05, 2);


    for( i = 0; i < found.size(); i++ )
        {
            Rect r = found[i];
            for( j = 0; j < found.size(); j++ )
                if( j != i && (r & found[j]) == r)
                    break;
            if( j == found.size() )
                found_filtered.push_back(r);
        }



    if(found.size()) {
            Rect r = found[0];
            r.x += cvRound(r.width*0.1);
            r.width = cvRound(r.width*0.8);
            r.y += cvRound(r.height*0.07);
            r.height = cvRound(r.height*0.8);
            LOGD("c : %d, r : %d",r.height,r.width);



         rectangle(mGray, r.tl(), r.br(), cv::Scalar(255,0,0), 3);
    }

所以,我想逐行理解这段代码:

if(found.size()) {
                Rect r = found[0];
                r.x += cvRound(r.width*0.1);
                r.width = cvRound(r.width*0.8);
                r.y += cvRound(r.height*0.07);
                r.height = cvRound(r.height*0.8);
                LOGD("c : %d, r : %d",r.height,r.width);
你觉得怎么样?

1 个答案:

答案 0 :(得分:0)

看起来像是如下缩小对象矩形(红色 - 原始检测,绿色 - 新矩形):

enter image description here

r.x += cvRound(r.width*0.1); // move rectangle to right by 10% of width
r.width = cvRound(r.width*0.8); // reduce rectangle width
r.y += cvRound(r.height*0.07); // move rectangle down by 7% of width
r.height = cvRound(r.height*0.8); // reduce rectangle width
LOGD("c : %d, r : %d",r.height,r.width); // print coordinates of top left corner, width and height

我认为这是因为当您训练探测器时,您会在物体周围传递带有一些背景的样本。因此,当您使用此类检测器检测对象时,矩形将比对象大得多。为了使矩形更具体,您可以如上所述缩小它。