在移除较小区域时绘制轮廓

时间:2013-11-02 10:37:14

标签: c++ opencv drawing webcam contour

我想在现场网络摄像头中手绘轮廓。当我使用下面的代码时,OpenCV正在检测由噪声,阴影等引起的许多其他轮廓。

    cv::findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    cv::drawContours(fgimg,contours,-1,cv::Scalar(0,0,255),2);

我在网上找到了以下代码,以删除不重要的小区域。

cv::findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    for(int i=0;i<contours.size();i++)
    {

                    if(contours[i].size() < 10000 && contours[i].size() > 0)
            {

            int size=cv::contourArea(contours[i]);
            if(size>5000)
            {
                            //Draw contour
                            vector<vector<Point> > tcontours;
                            tcontours.push_back(contours[i]);
                            cv::drawContours(fgimg,tcontours,-1,cv::Scalar(0,0,255),2);
                            }
                            }
            }

但它根本没有绘制任何轮廓。我在 if(size> 5000)语句之后添加了一个cout语句,看看这个语句是否真实,我得到了Cout输出。 那么为什么没有轮廓呢? push_back函数有什么问题吗?

1 个答案:

答案 0 :(得分:0)

  1. 您确定要使用CV_RETR_EXTERNAL吗?
  2. if(contours[i].size() < 10000 && contours[i].size() > 0)在这里没用了
  3. 临时矢量vector<vector<Point> > tcontours;没有任何意义
  4. 尝试:

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(fgmask, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
    
    // draw contours:   
    Mat newImg = Mat::zeros(fgmask.size(), CV_8UC3);
    for (unsigned int i = 0; i < contours.size(); i++)
    {
        if (contourArea(contours[i]) > 5000)
            drawContours(newImg, contours, i, Scalar(0,0,255), 1, 8, hierarchy, 0);
    }
    
相关问题