Cuando la búsqueda de los contornos, he utilizado el CV_RETR_CCOMP argumento. Esto se supone para crear dos niveles de la jerarquía – el primer nivel es para el contorno exterior, en el segundo nivel son de los límites de los agujeros. Sin embargo, nunca he usado una jerarquía de antes, así que no estoy familiarizado con esto.

Podría alguien instruir a mi sobre cómo acceder a los límites de los agujeros sólo? Quiero despreciar el contorno exterior y sólo se dibuja el agujero límites. Ejemplos de código que será apreciado. Estoy usando el C++ interfaz no la C, así que por favor no sugieren las funciones de C (es decir, usar findContours () en lugar de cvFindContours ()).

  • Entre el C++ versión y la versión en C es trivial. FYI.
InformationsquelleAutor fdh | 2011-12-11

2 Comentarios

  1. 41

    La jerarquía devuelto por findContours tiene la siguiente forma:
    hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}

    CV_RETR_CCOMP, devuelve una jerarquía de contorno exterior y agujeros.
    Esto significa que los elementos 2 y 3 de hierarchy[idx] tienen en la mayoría de uno de estos no es igual a -1, es decir, cada elemento tiene o no tiene padre, madre o hijo, o un padre de familia pero a ningún niño, o un niño, pero no de los padres.

    Un elemento con un padre, pero a ningún niño sería una frontera de un agujero.

    Que significa que, básicamente, ir a través de hierarchy[idx] y dibujar cualquier cosa con hierarchy[idx][3]>-1.

    Algo como (funciona en Python, pero no he probado los de C++. La Idea está bien.):

    findContours( image, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
    
    if ( !contours.empty() && !hierarchy.empty() ) {
    
        //loop through the contours/hierarchy
        for ( int i=0; i<contours.size(); i++ ) {
    
            //look for hierarchy[i][3]!=-1, ie hole boundaries
            if ( hierarchy[i][3] != -1 ) {
                //random colour
                Scalar colour( (rand()&255), (rand()&255), (rand()&255) );
                drawContours( outImage, contours, i, colour );
            }
        }
    }
    • asegúrese de hacer algunas pruebas. La jerarquía no puede ser lo que usted espera. He intentado esto con la imagen de stackoverflow.com/questions/8449378/finding-contours-in-opencv y el fotograma de la imagen de un padre, el contorno exterior era un niño, y el contorno interior era ninguno de los dos.
    • Lo siento, quise decir el encuadre de la imagen era un niño y el círculo exterior del contorno de un padre.
    • Gracias, supongo que voy a tener que encontrar una manera alrededor de ella.
  2. 4

    AFAIK cuando se utiliza CV_RETR_CCOMP, todos los agujeros están en el mismo nivel.

    int firstHoleIndex = hierarchy[0][2];
    for (int i = firstHoleIndex; i >= 0 ; i = hierarchy[i][0])
    //contours.at(i) is a hole. Do something with it.
    • Esto no funcionará si el primer contorno no tiene agujeros en ella.

Dejar respuesta

Please enter your comment!
Please enter your name here