C++ OpenCV 2.4.4中的轮廓/连接组件

C++ OpenCV 2.4.4中的轮廓/连接组件,c++,opencv,stdvector,mat,opencv-contour,C++,Opencv,Stdvector,Mat,Opencv Contour,我目前正在处理一幅有很多检测到的轮廓的图像。 我的目标是缩小轮廓的数量,最终只得到我想要的轮廓。 为此,我基于面积和边界框进行了一系列测试 目前,我在每一步之后都会为我想要保留的轮廓绘制一个轮廓,然后是一个查找轮廓 我的问题是我只想做一次查找轮廓,然后删除我不想要的轮廓,这可能吗 当前方式: Mat src; Mat BW; src = imread("img.bmp", 0); if( src.channels() > 1) { cvtColor(src, src, CV_BGR2G

我目前正在处理一幅有很多检测到的轮廓的图像。 我的目标是缩小轮廓的数量,最终只得到我想要的轮廓。 为此,我基于面积和边界框进行了一系列测试

目前,我在每一步之后都会为我想要保留的轮廓绘制一个
轮廓,然后是一个
查找轮廓

我的问题是我只想做一次
查找轮廓
,然后删除我不想要的轮廓,这可能吗

当前方式:

Mat src;
Mat BW;
src = imread("img.bmp", 0);
if( src.channels() > 1)
{
  cvtColor(src, src, CV_BGR2GRAY);
}

threshold(src, BW, 100, 255, CV_THRESH_OTSU);
imshow( "Tresh", BW );

Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat dstP = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat dst1 = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat dst2 = Mat::zeros(src.rows, src.cols, CV_8UC3);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

findContours( BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
for( int i = 0; i < contours.size(); i++ )
{
    Scalar color( rand()&255, rand()&255, rand()&255 );
    drawContours( dst, contours, i, color, 2/*CV_FILLED*/, 8, hierarchy );
}

/// Test on area  ******************************************************************
for( int i = 0; i < contours.size(); i++ )
{
    if ( contourArea(contours[i], false) > 100 && contourArea(contours[i], false) < 200000)
    {
        Scalar color( rand()&255, rand()&255, rand()&255 );
        drawContours( dst1, contours, i, color, CV_FILLED, 8, hierarchy );
    }
}

/// Next test **********************************************************************
    cvtColor(dst1, dstP, CV_BGR2GRAY);
    findContours( dstP, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
matsrc;
Mat BW;
src=imread(“img.bmp”,0);
如果(src.channels()>1)
{
CVT颜色(src、src、CV_bgr2灰色);
}
阈值(src、BW、100255、CV_THRESH_OTSU);
imshow(“Tresh”,BW);
Mat dst=Mat::零(src.rows、src.cols、CV_8UC3);
Mat dstP=Mat::零(src.rows、src.cols、CV_8UC3);
Mat dst1=Mat::零(src.rows、src.cols、CV_8UC3);
Mat dst2=Mat::零(src.rows、src.cols、CV_8UC3);
矢量等值线;
向量层次;
findContours(BW、轮廓、层次、CV_RETR_CCOMP、CV_CHAIN_APPROX_SIMPLE);
对于(int i=0;i100和轮廓面积(轮廓[i],假)<200000)
{
标量颜色(rand()&255,rand()&255,rand()&255);
绘制轮廓(dst1,轮廓,i,颜色,CV_填充,8,层次);
}
}
///下一次测试**********************************************************************
CVT颜色(dst1、dstP、CV_BGR2GRAY);
findContours(dstP、等高线、层次、CV_RETR_CCOMP、CV_CHAIN_APPROX_SIMPLE);

通缉方式:

if ( contourArea(contours[i], false) < 100 && contourArea(contours[i], false) > 200000)
{
    contours.erase(i); // Doesn't work
}
if(轮廓面积(轮廓[i],假)<100和轮廓面积(轮廓[i],假)>200000)
{
轮廓。擦除(i);//不起作用
}
现在有人知道如何擦除这些轮廓吗

附言:我不在乎内部轮廓,我希望所有的轮廓都能通过我的测试



编辑,解决方案(由limonana指出)是:
等高线.erase(等高线.begin()+i)

可能是因为您没有按应有的方式使用擦除功能。它应该有一个迭代器。

也许你可以创建一个新的countour结构,并不断添加那些通过测试的。为什么它不起作用?其余的数据保存在哪里?谢谢,我实际上就在这一页上,但我不习惯这样。使用轮廓。擦除(轮廓。开始()+i);