绘制轮廓,同时删除较小的区域

Drawing Contours while removing smaller areas

本文关键字:区域 删除 轮廓 绘制      更新时间:2023-10-16

我想在实时网络摄像头馈送中在我的手周围绘制轮廓。当我使用以下代码时,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. 您确定要使用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);
}