boundingrect不适用于opencv c ++中的轮廓

时间:2014-08-13 14:35:02

标签: opencv visual-c++ contour

{

 #include<opencv2\opencv.hpp>
 #include<iostream>
 #include<conio.h>

 using namespace std;
 using namespace cv;

 int main()
{
int a = 0;

Mat frame, diffimage,back,frame_gray;
VideoCapture cap("D:\\elance\\check\\Sent3.avi");
vector<vector<Point>> contours;
BackgroundSubtractorMOG2 bg;
vector<int> params;
params.push_back(CV_IMWRITE_PNG_COMPRESSION);
params.push_back(9);

for (int i = 0; i < 200;i++)
{
    cap >> frame;
    if (frame.empty())
        break;
    bg(frame,back);
}

bg.getBackgroundImage(back);
cap.set(CV_CAP_PROP_POS_FRAMES,0);
cvtColor(back, back, CV_BGR2GRAY);
//for (int f = 0; f < 20;f++)
while (1)
{
    a = a + 1;
    cout << "Frame no : " << a<<endl;
    cap >> frame;
    if (frame.empty())
        break;
    cvtColor(frame, frame_gray, CV_BGR2GRAY);
    absdiff(frame_gray, back, diffimage);
    threshold(diffimage, diffimage, 10, 255, CV_THRESH_BINARY);

    for (int i = 0; i < 2; i++)
    {
        cv::erode(diffimage, diffimage, cv::Mat());
        cv::dilate(diffimage, diffimage, cv::Mat());
    }
    findContours(diffimage, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
    cout << "Contour Size : " << contours.size()<<endl;
    vector<Rect> boundRect(contours.size());
    for (int i = 0; i < contours.size(); i++)
    {
        drawContours(frame, contours, i, cv::Scalar(0, 255, 255), 1);
        Mat smoothCont;
        smoothCont = cv::Mat(contours[i]);
        cout << smoothCont.rows << "\t" << smoothCont.cols <<"\t"<<smoothCont.depth()<< endl << endl;
        if (smoothCont.rows > 0 && smoothCont.rows < 10000)
            boundRect[i] = boundingRect(Mat(contours[i]));
    }
    for (int i = 0; i < contours.size(); i++)
        rectangle(frame, boundRect[i], Scalar(0, 255, 255), 1, 8, 0);
    imshow("Diff", diffimage);
    imshow("frame", frame);
    imwrite("D:\\test.jpg", frame, params);
    waitKey(30);
    break;
}

}

此代码基本上采用轮廓,结果是轮廓上的矩形。但只有一个是由盒子限制而其他轮廓仍然没有限制盒子。

任何人都可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

也许“if(smoothCont.rows&gt; 0&amp;&amp; smoothCont.rows&lt; 10000)”将它们过滤掉了?