2012-07-02 14 views
5

Estoy tratando de usar la función findcontours() en OpenCV en la imagen a continuación.OpenCV findcontours devuelve 2 contornos para cada círculo

findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

Cuando hago esta consulta: contours.size() devuelve 18, por lo que parece 2 contorno de cada círculo. Los círculos son como se puede ver un grosor de 1 píxel, ¿cómo son los 2 contornos? ¿Es uno para exterior y uno para interno, si es así, cómo puedo forzar esta función para detectar solo un contorno para cada círculo? Pensé que un contorno se definía como una secuencia conectada de píxeles, de 1 píxel de grosor.

Says there are 18 contours!!

Respuesta

4

no puedo confirmar esto, Pero creo que el algoritmo utilizado por esta función hace algo equivalente a calcular el gradiente para cada función. Lo que significa que habrá un contorno en el borde exterior y otro en el borde interior, tal como sugirió. Para confirmar esto, se puede tratar de utilizar una imagen de entrada, donde los círculos se han llenado de color blanco (elimininating el contorno interior)

también puede probar con diferentes parámetros en los findContours funcionar

Por ejemplo, intenta utilizando CV_RETR_EXTERNAL en lugar de CV_RETR_TREE asumo el círculo interior está anidada dentro de la exterior, por lo que este debe forzarlo a regresar sólo los exteriores

+0

Pero cuando miro este ejemplo [aquí] (http://jmpelletier.com/a-simple-opencv-tutorial/) parece que no está contando el interior y el exterior por separado. Pero el ejemplo es la versión C de FindContours. ¿Hay alguna diferencia entre las implementaciones antiguas y las nuevas? –

+0

no, no debería haber ninguna diferencia entre la versión C y la versión C++ que pueda influir en el resultado final. De hecho, por lo que recuerdo, uno es solo un envoltorio para el otro. Sin embargo, mirando las imágenes de ese enlace, veo exactamente lo contrario de lo que dijo. parece detectar tanto el contorno interno como el externo de cada círculo, lo que tiene aún más sentido en la imagen que se muestra allí – Naps62

+1

De hecho, usar el indicador CV_RETR_EXTERNAL debería arreglarlo por usted. Consulte aquí para obtener una lista completa de indicadores: http://opencv.itseez.com/modules/imgproc/doc/salud_estructura_y_diseños_de_formatos.html#void findContours (Imagen InputOutputArray, Contornos OutputArrayOfArrays, jerarquía OutputArray, modo int, método int, Desplazamiento de puntos) –

0

es posible que ya has dado cuenta de esto, pero ...

buscarConfluye solo las preocupaciones sobre los objetos blancos y, por lo tanto, reconoce cada uno de los círculos ahuecados como una banda, por lo que produce dos contornos.

La mejor manera es crear otra imagen con círculos rellenos y aplicar findContoours para esa imagen. Te dará lo que quieras.

Cuestiones relacionadas