0

我想在实时网络摄像头提要中在我的手周围绘制轮廓。当我使用以下代码时,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 函数有问题还是什么?

4

1 回答 1

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

尝试:

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);
}
于 2013-11-02T10:59:42.620 回答