Контуры / Связанные компоненты в OpenCV 2.4.4

В настоящее время я работаю над изображением с множеством обнаруженных контуров.
Моя цель — сузить количество контуров, чтобы в итоге получился только тот, который я ищу.
Для этого я провожу кучу тестов, основанных на области и ограничительной рамке.

Сейчас я делаю после каждого шага drawContours за контуры, которые я хочу сохранить, а затем findContours,

Моя проблема что я хотел бы сделать findContours только один раз, а затем просто стереть контуры, которые я не хочу, это возможно?

Текущий способ:

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 );

так далее

Разыскиваемый путь:

if ( contourArea(contours[i], false) < 100 && contourArea(contours[i], false) > 200000)
{
contours.erase(i); // Doesn't work
}

Кто-нибудь сейчас как стереть эти контуры?

PS: мне нет дела до внутренних контуров, я хочу, чтобы все они прошли мои тесты.


РЕДАКТИРОВАТЬ, решение (указано лимонаном): contours.erase(contours.begin()+i);

2

Решение

Может быть, это потому, что вы не используете стирание, как следует. он должен получить итератор.
http://www.cplusplus.com/reference/vector/vector/erase/

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]