【问题标题】:Bounding a foreground object限定前景对象
【发布时间】:2015-07-15 03:31:47
【问题描述】:

我想用一个矩形来限制前景对象,我该怎么做呢?

我尝试通过收集白色像素来限制矩形,但它限制了整个屏幕...

我该如何解决这个问题?

//defined later
vector<Point> points;
RNG rng(12345);

int main(int argc, char* argv[])
{
    //create GUI windows
    namedWindow("Frame");
    namedWindow("FG Mask MOG 2");
    pMOG2 = createBackgroundSubtractorMOG2();

    VideoCapture capture(0);
        //update the background model
        pMOG2->apply(frame, fgMaskMOG2);
        frame_check = fgMaskMOG2.clone();
        erode(frame_check, frame_check, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
        dilate(frame_check, frame_check, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));

        vector<vector<Point> > contours;
        vector<Vec4i> hierarchy;

        /// Detect edges using Threshold
        //threshold(frame_check, frame_check, 100, 255, THRESH_BINARY);
        //find contours
        findContours(frame_check, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

        //points
        for (size_t i = 0; i < contours.size(); i++) {
            for (size_t j = 0; j < contours[i].size(); j++) {
                if (contours[i].size() > 2000)
                {
                    cv::Point p = contours[i][j];
                    points.push_back(p);
                }
            }
        }



            if (points.size() > 0){
                Rect brect = cv::boundingRect(cv::Mat(points).reshape(2));
                rectangle(frame, brect.tl(), brect.br(), CV_RGB(0, 255, 0), 2, CV_AA);
                cout << points.size() << endl;

            }
            imshow("Frame", frame);
            imshow("FG Mask MOG 2", fgMaskMOG2);
            //get the input from the keyboard
            keyboard = waitKey(1000);
        }
    }

【问题讨论】:

  • @Miki 我猜整个代码太大而无法发布...
  • 我说的是工作,而不是整个。然而,第一件事是你永远不会清除points。在两个 for 循环之前尝试points.clear();
  • (你不需要cv::Mat(points).reshape(2),只需通过points

标签: opencv


【解决方案1】:

试试这个,它来自我正在进行的一个项目。为了隔离对象,我使用生成二进制图像的颜色蒙版,但在您的情况下,在前景图像上使用适当的阈值(过滤后),您可以获得相同的结果。

// Morphological opening
erode(binary, binary, getStructuringElement(MORPH_ELLIPSE, filterSize));
dilate(binary, binary, getStructuringElement(MORPH_ELLIPSE, filterSize));

// Morphological closing
dilate(binary, binary, getStructuringElement(MORPH_ELLIPSE, filterSize));
erode(binary, binary, getStructuringElement(MORPH_ELLIPSE, filterSize));

// Find contours
vector<vector<Point>> contours;
findContours(binary, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

vector<Rect> rectangles;
for(auto& contour : contours)
{
    // Produce a closed polygon with object's contours
    vector<Point> polygon;
    approxPolyDP(contour, polygon, 3, true);

    // Get polygon's bounding rectangles
    Rect rect = boundingRect(polygon);
    rectangles.push_back(rect);
}

【讨论】:

    【解决方案2】:

    这是一个关于如何使用轮廓点在前景对象周围绘制边界框的小示例。它使用 OpenCV 2.9,因此如果您使用的是 OpenCV 3.0,您可能需要更改 BackgroundSubtractorMOG2 的初始化。

    #include <opencv2\opencv.hpp>
    using namespace cv;
    
    int main(int argc, char *argv[])
    {
       BackgroundSubtractorMOG2 bg = BackgroundSubtractorMOG2(30, 16.0, false);
       VideoCapture cap(0);
       Mat3b frame;
       Mat1b fmask;
    
       for (;;)
       {
           cap >> frame;
           bg(frame, fmask, -1);
    
           vector<vector<Point>> contours;
           findContours(fmask.clone(), contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    
           for(int i=0; i<contours.size(); ++i)
           {
               if(contours[i].size() > 200)
               {
                   Rect roi = boundingRect(contours[i]);
                   drawContours(frame, contours, i, Scalar(0,0,255));
                   rectangle(frame, roi, Scalar(0,255,0));  
               }
           }
    
           imshow("frame", frame);
           imshow("mask", fmask);
           if (cv::waitKey(30) >= 0) break;
       }
       return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-11
      • 2021-01-13
      • 2013-10-06
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多