Hemos buscado en el mundo on line para traerte la respuesta a tu problema, en caso de dudas deja la duda y contestaremos con gusto.
Solución:
Puedes usar std::sort
con un objeto de función de comparación personalizado
// comparison function object
bool compareContourAreas ( std::vector contour1, std::vector contour2 )
double i = fabs( contourArea(cv::Mat(contour1)) );
double j = fabs( contourArea(cv::Mat(contour2)) );
return ( i < j );
Uso:
[...]
// find contours
std::vector > contours;
std::vector hierarchy;
cv::findContours( binary_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );
// sort contours
std::sort(contours.begin(), contours.end(), compareContourAreas);
// grab contours
std::vector biggestContour = contours[contours.size()-1];
std::vector smallestContour = contours[0];
Solo dé una solución usando la función lambda si C++ 11 está disponible.
sort(contours.begin(), contours.end(), [](const vector& c1, const vector& c2)
return contourArea(c1, false) < contourArea(c2, false);
);
Entonces puedes acceder contours[0]
para obtener el contorno con el área más pequeña y contours[contours.size()-1]
para obtener el que tiene el área más grande porque los contornos se ordenan en orden ascendente.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)