C++ 使用boundingRect时,如何调整长方体的大小以固定大小?

C++ 使用boundingRect时,如何调整长方体的大小以固定大小?,c++,opencv,contour,C++,Opencv,Contour,在这个项目中,我想使用轮廓数(cnum)作为对象的索引,这样我就可以将它们用于下一个过程(我正在使用斑点跟踪进行虚假人体检测)。我想在DetectMultiScale内调整boundingRect的大小,怎么做 下面是我的代码: int main(int argc, char *argv[]) { cv::Mat frame; cv::Mat blurred; cv::Mat fg; cv::Mat bgmodel; cv::Mat thresh

在这个项目中,我想使用轮廓数(cnum)作为对象的索引,这样我就可以将它们用于下一个过程(我正在使用斑点跟踪进行虚假人体检测)。我想在DetectMultiScale内调整boundingRect的大小,怎么做

下面是我的代码:

int main(int argc, char *argv[])
{
    cv::Mat frame;
    cv::Mat blurred;
    cv::Mat fg;     
    cv::Mat bgmodel;
    cv::Mat threshfg;
    cv::Mat blob;
    int pixblob = 0;
    int tot_bgr = 0;
    int tot_ex_bgr = 0;
    int green0 = 0;
    int green1 = 0;
    int green2 = 0;
    int green3 = 0;

    cv::namedWindow("Frame");   
    cv::namedWindow("Background Model");
    cv::namedWindow("Blob");

    cv::VideoCapture cap("campus.avi"); 

    cv::BackgroundSubtractorMOG2 bgs;                       
        bgs.nmixtures = 3;
        bgs.history = 500;
        bgs.bShadowDetection = true;                            
        bgs.nShadowDetection = 0;                               
        bgs.fTau = 0.25;                                        

    std::vector<std::vector<cv::Point>> contours;               

    cv::CascadeClassifier human;
    assert(human.load("hogcascade_pedestrians.xml"));
    for(;;){
        cap >> frame;   

        cv::GaussianBlur(frame,blurred,cv::Size(3,3),0,0,cv::BORDER_DEFAULT);

        bgs.operator()(blurred,fg);                         
        bgs.getBackgroundImage(bgmodel);                                

        cv::erode(fg,fg,cv::Mat(),cv::Point(-1,-1),1);                         
        cv::dilate(fg,fg,cv::Mat(),cv::Point(-1,-1),3); 

        cv::threshold(fg,threshfg,70.0f,255,CV_THRESH_BINARY);

        cv::findContours(threshfg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
        cv::cvtColor(threshfg,blob,CV_GRAY2RGB);
        cv::drawContours(blob,contours,-1,cv::Scalar(255,255,255),CV_FILLED,8);

        int cmin = 20; 
        int cmax = 1000;
        bool FOD1 = true;
        bool FOD2 = true;
        std::vector<cv::Rect> rects;

        for(int cnum = 0; cnum < contours.size(); cnum++){

            if(contours[cnum].size() > cmin && contours[cnum].size() < cmax){       

                human.detectMultiScale(frame(cv::boundingRect(contours[cnum])),rects); //I wanna resize the box here!

                if(rects.size() > 0){

                        cv::Rect r0 = cv::boundingRect(contours[cnum]);
                        cv::rectangle(frame, 
                                r0, 
                                cv::Scalar(255, 0, 0));


                        cv::putText(frame,
                                "HUMAN",
                                cv::Point(r0.x + r0.width / 2, r0.y + r0.height / 2),
                                cv::FONT_HERSHEY_SIMPLEX,
                                0.5,
                                cv::Scalar(0,0,255),
                                2,
                                8);


                }
            }
        }

        cv::imshow("Frame",frame);
        cv::imshow("Background Model",bgmodel);
        cv::imshow("Blob",blob);
        if(cv::waitKey(30) >= 0) break;
    }
    return 0;
}
intmain(intargc,char*argv[])
{
cv::垫架;
cv::Mat模糊;
cv::Mat-fg;
cv::Mat-bgmodel;
cv::Mat threshfg;
cv::Mat blob;
int-pixblob=0;
int tot_bgr=0;
int tot_ex_bgr=0;
int green0=0;
int green1=0;
int green2=0;
int green3=0;
cv::namedWindow(“框架”);
cv::namedWindow(“背景模型”);
cv::namedWindow(“Blob”);
简历:视频捕获cap(“campus.avi”);
cv::背景MOG2 bgs;
bgs.nmixtures=3;
bgs.history=500;
bgs.bShadowDetection=true;
bgs.nShadowDetection=0;
bgs.fTau=0.25;
矢量轮廓;
cv::人类;
assert(human.load(“hogcascade_.xml”);
对于(;;){
cap>>框架;
cv::GaussianBlur(帧,模糊,cv::大小(3,3),0,0,cv::边界_默认值);
bgs.operator()(模糊,前景);
getBackgroundImage(bgmodel);
侵蚀(fg,fg,cv::Mat(),cv::Point(-1,-1),1);
扩张(fg,fg,cv::Mat(),cv::Point(-1,-1),3);
cv::阈值(fg,threshfg,70.0f,255,cv_THRESH_二进制);
cv::findContours(阈值、轮廓、cv_-RETR_外部、cv_-CHAIN_近似值_-SIMPLE);
cv::CVT颜色(阈值、斑点、cv_灰度2RGB);
cv::drawContours(水滴,轮廓,-1,cv::Scalar(255255),cv_填充,8);
int-cmin=20;
int cmax=1000;
bool FOD1=真;
bool FOD2=真;
std::向量矩形;
对于(int cnum=0;cnumcmin和等高线[cnum].size()0){
cv::Rect r0=cv::boundingRect(等高线[cnum]);
cv::矩形(框架,
r0,
标量(255,0,0));
cv::putText(框架,
“人类”,
cv::点(r0.x+r0.width/2,r0.y+r0.height/2),
cv::FONT_HERSHEY_SIMPLEX,
0.5,
cv::标量(0,0255),
2.
8);
}
}
}
cv::imshow(“帧”,帧);
cv::imshow(“背景模型”,bgmodel);
cv::imshow(“Blob”,Blob);
如果(cv::waitKey(30)>=0)中断;
}
返回0;
}

我会很感激这里的任何帮助。谢谢:)

您是否调试以查看r0是否正确。还有:“这里的错误,我知道这不是cv::Point,但我不知道如何处理”是什么意思?简单地把文本的位置放在那里。当我想添加文本时,我得到了错误代码:错误1错误C2664:“cv::putText”:无法将参数3从“std::vector”转换为“cv::Point”,代码什么也不画,根本不画矩形…:(对于矩形,代码没有画任何东西,根本没有画矩形……我想这里的问题是:human.detectMultiScale(frame(cv::boundingRect(contours[cnum])),rects);:(我现在知道问题了,boundingRect裁剪的图片太小了。因此无法检测到人。谢谢!:D