Вычтите все контуры из изображения, кроме того, которое имеет наибольшую площадь

cv::Mat thr;

std::vector<std::vector<cv::Point> > contours;
std::vector<std::vector<cv::Vec4i> > hierarchy;

int largest_area          = 0;
int largest_contour_index = 0;

cv::findContours( thr, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image

for( int i = 0; i < contours.size(); i++ )                                           // iterate through each contour.
{
double a = contourArea( contours[i], false );                                        // Find the area of contour
if(a > largest_area)
{
largest_area          = a;
largest_contour_index = i;                                                    // Store the index of largest contour
}

}

Что делать после нахождения индекса наибольшего контура? Как я могу удалить все остальные контуры с его внутренними областями?
Изображение является двоичным (cv :: Mat thr). Просто черный фон с белыми участками.
Благодарю.

0

Решение

В вашем случае удаление контуров с его внутренними областями равно заливке их черным. Это можно сделать, нарисовав контурные области черным цветом:

for (size_t i=0; i<contours.size(); ++i) {
if (i != largest_contour_index) { // not the largest one
cv::drawContours(thr, contours, i, cv::Scalar(0,0,0), CV_FILLED);
}
}
0

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

После нахождения контуров найдите индекс наибольшего контура и нарисуйте этот контур на мат.

int indexOfBiggestContour = -1;
int sizeOfBiggestContour = 0;
for (int i = 0; i < contours.size(); i++)
{
if (contours[i].size() > sizeOfBiggestContour)
{
sizeOfBiggestContour = contours[i].size();
indexOfBiggestContour = i;
}
}
cv::Mat newImage;
drawContours(newImage, contours, indexOfBiggestContour, Scalar(255), CV_FILLED, 8, hierarchy);
0

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