Tengo que conectar contornos cercanos en una imagen basada en la distancia entre ellos que especifica si los contornos se van a conectar.
Ahora hay una pregunta sobre el mismo problema aquí /programming/8973017/opencv-c-obj-c-connect-nearby-contours pero aquí combina todos los contornos en uno solo. Esto no lo quiero. No creo que haya alguna función en opencv para esto, pero puede sugerir un algoritmo para eso. Mi aplicación es así:
Estoy detectando manos, así que utilicé un algoritmo de detección de piel para determinarlas, pero dado que mi piel no es blanca y tal vez debido a las condiciones de aclaración en algún momento el contorno se rompe en el codo. Por lo tanto, quiero que se conecten los contornos cercanos, pero no todos (porque ambas manos estarán allí en contornos). (Por manos quiero decir desde el hombro hasta la palma).
Además, creo que al usar alguna detección de bordes, obtendré los límites de mis manos y detectaré si parte de este parche dentro de este límite se detecta como piel, entonces toda la región dentro de este límite se detectará como piel, pero no estoy seguro de cómo hacer esto parte.
Cualquier ayuda será apreciada. Gracias por adelantado
Imagen de muestra:
En esta imagen quiero conectar puntos (8 conectividad) que son menos de 40 píxeles de distancia para que pueda obtener mi mano izquierda como un solo contorno
Mi objetivo es obtener solo el contorno de la mano (no me importa ninguna otra región)
Respuestas:
Si no le preocupa la velocidad o el contorno exacto de la mano, a continuación encontrará una solución simple.
El método es así: toma cada contorno y encuentra la distancia a otros contornos. Si la distancia es inferior a 50, están cerca y los juntas. Si no, se ponen como diferentes.
Por lo tanto, verificar la distancia a cada contorno es un proceso lento. Toma unos segundos Así que no puedes hacerlo en tiempo real.
Además, para unir contornos, los puse en un solo conjunto y dibujé un casco convexo para ese conjunto. Entonces, el resultado que está obteniendo es en realidad un casco de mano convexo, no una mano real.
A continuación se muestra mi código en OpenCV-Python. No he elegido ninguna optimización, solo quería que funcionara, eso es todo. Si resuelve su problema, vaya a la optimización.
A continuación se muestran los resultados que obtuve:
fuente
Para solucionar el problema de conectividad, puede intentar una operación de cierre:
Dudo que esto produzca los resultados que desea, pero puede intentarlo.
fuente
Parece que estás "segmentando en exceso" tu imagen. Las operaciones morfológicas, como ha sugerido bjnoernz, ayudarían. En particular, un enfoque de cuenca hidrográfica debería acercarse más a lo que desea que simplemente verificar la distancia (como en el ejemplo de Python anterior). Ver http://cmm.ensmp.fr/~beucher/wtshed.html .
fuente