Componentes conectados usando OpenCV

En la visión por computadora y el procesamiento de imágenes, utilizamos muchas ideas de otras áreas de la informática para resolver nuestros desafíos. El problema del que hablaré es el siguiente: dada una imagen monocromática, quiero obtener los grupos de píxeles en primer plano aislados por una región blanca. El nombre dado a estos grupos es componente conectado .

En un componente conectado, dado un punto dentro, puedo caminar hasta cualquier otro punto dentro de él usando solo puntos que también están dentro. Esta imagen ilustra lo que quiero decir. Cada color es un componente conectado.

usando OpenCV

OpenCV es una famosa biblioteca de visión por computadora que tiene toneladas de características geniales y se usa ampliamente. Maneja la apertura de varios tipos de archivos de imagen y video y tiene el código para encontrar los componentes conectados de una imagen (incluidos los agujeros en los componentes).

Lo primero que debe saber es cómo abrir una imagen e Cómo compilar su primer programa. Instrucciones de compilación para Windows y para Linux. Este programa abre una imagen y guarda una copia como resultado.png. Expandiremos este ejemplo para dar el resultado anterior.

Encontrar los componentes conectados

Para encontrar los componentes conectados, utilizaremos la función CVFindConTours de OPENCV. Con los parámetros correctos, esta función devuelve una lista con los contornos de cada componentes conectados y para cada componente el contorno de los agujeros dentro de ella.

cvmemstorage e cvcontour

<

< P> En OpenCV, cada vez que usamos cualquier tipo de estructura dinámica, necesitamos usar un CVMemStorage para contener la memoria para ella. Dado que CVFindConTours devuelve una lista, debemos crear un CVMemStorage y pasar a esta función. Sigue el código que debe agregarse (una versión completa del programa será disponible al final del artículo.

READ  La existencia muy real de imágenes subliminales en los lanzamientos teatrales principales de Hollywood

Declarar las variables:

cvmemstorage *mem; < br> cvseq *contorns, *ptr;

y agregue este código en el código/ *Agregar aquí */línea:

cvThreshold(img, img, 150, 255, CV_THRESH_BINARY);
mem = cvCreateMemStorage(0);
cvFindContours(img, mem, &contours;, sizeof(CvContour), CV_RETR_CCOMP,
CV_CHAIN_APPROX_SIMPLE, cvPoint( 0,0));

El parámetro cv_retr_ccomps indica la función que los contornos de los componentes conectados deben extraerse. vértices de ese polígono. El código actualizado está aquí.

secuencias y openCV

OpenCV usa el tipo CVSEQ para construir secuencias de objetos. En un CVSEQ hay 4 punteros: H_NEXT, H_PREV, V_NEXT E V_PREV, que apuntan a otras secuencias. H_NEXT y H_PREV apuntan a secuencias en el mismo nivel y V_NEXT y V_PREV apunta a secuencias en otros niveles. En nuestro caso, esto es excelente: en el primer nivel están los contornos externos de los componentes conectados y en el segundo nivel están los contornos de los agujeros de cada componente.

dibujando los componentes conectados <// b>

Completaremos el ejemplo de pintura de los componentes de conexión en una nueva imagen. Usamos la función CVDrawConTours. Agregue lo siguiente después del último código. El código actualizado está aquí.

para (ptr = contorns; ptr! = Null; ptr = ptr-> h_next) {
cvscalar color = cv_rgb (rand () y 255, rand ( ) & 255, rand () y 255);
CVDrawConTours (CC_Color, PTR, Color, CV_RGB (0,0,0), -1, CV_Filled, 8, CVPoint (0,0));
}

¡y eso! Ahora compile el programa y ejecútelo con esta imagen. Debe obtener la primera imagen como resultado 🙂

Más tareas con componentes conectados

Hay otras tareas comunes que están relacionadas con los componentes conectados. Listaré a tres de ellos aquí:

Obtendré el cuadro delimitador de un componente

Usamos la función CVBoundingRect. Recibe un CVSEQ o CVConTour y otro parámetro que pregunta si el cuadro debe recalcularse (1) o si puede tomar el valor de CVConTour (0). Devuelve un cvrect, que contiene 4 atributos: x, y, altura de ancho e.

READ  ICAM - transmisión de video de cámara web para iPhone

aproximar un componente por un polígono

Podemos usar cvapproxpoly, Eso se aproxima a un contorno por un polígono. Esto se hace cuando se usa CV_chain_approx_simple, pero no sé si se usa el mismo método.

si un punto está dentro de un componente conectado

Podemos usar CVPointPolyGontest para probar si hay un punto dentro de algún polígono. Dado que podemos aproximar un contorno por un polígono, podemos usar esta función para verificar si un punto pertenece a un componente conectado. No debemos olvidar verificar si el punto está fuera de los agujeros en el componente.

Para otro uso interesante de los componentes conectados, puede verificar este otro artículo.

Conclusión < /b>
Esto es solo una introducción de cómo trabajar con componentes conectados. Hay varios algoritmos y técnicas que utilizan componentes conectados y esto puede brindarle ayuda para comprenderlos e implementarlos.

Referencia: