Saltar al contenido

OpenCV C++: Ordenar contornos por su área de contorno

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *