6

Actualmente, estoy enfrentando, en mi opinión, un problema bastante común que debería ser bastante fácil de resolver, pero hasta ahora todos mis planteamientos han fallado, así que estoy recurriendo a usted en busca de ayuda.Enfoque de coincidencia de formas/patrones en Computer Vision

Creo que el problema se explica mejor con algunas ilustraciones. Tengo algunos patrones como estos dos:

Pattern 1 Pattern 3

también tengo una imagen como (probablemente mejor, porque la foto ésta se originó a partir era bastante mal iluminada) esto:

Picture

(Observe cómo la escala de la plantilla se ajusta al tamaño de la imagen)

El objetivo final es una herramienta que determina si el usuario muestra un gesto de pulgar arriba/pulgar abajo y también algunos ángulos intermedios. Así que quiero hacer coincidir los patrones con la imagen y ver cuál se parece más a la imagen (o para ser más preciso, el ángulo que muestra la mano). Sé la dirección en la que se muestra el pulgar en el patrón, así que si encuentro el patrón que se ve idéntico, también tengo el ángulo.

estoy trabajando con OpenCV (con Python Bindings) y ya intentado cvMatchTemplate y MatchShapes pero hasta el momento no es realmente funcionar de forma fiable.

Solo puedo adivinar por qué MatchTemplate falló pero creo que un patrón más pequeño con un blanco más pequeño encaja completamente en el área blanca de una imagen creando así el mejor factor de coincidencia aunque es obvio que realmente no se ven iguales.

¿Hay algunos métodos ocultos en OpenCV que aún no he encontrado o hay un algoritmo conocido para ese tipo de problema que debo volver a implementar?

Feliz Año Nuevo.

Respuesta

6

algunas técnicas simples podrían trabajar:

  1. Después de binarización y segmentación, encontrar el diámetro de la burbuja (también conocido como la máxima distancia entre puntos, o el eje mayor) de Feret.
  2. Encuentra el casco convexo del conjunto de puntos, instálatelo y trátalo como una región conectada. Reste la imagen original con el pulgar. La diferencia será el área entre el pulgar y el puño, y la posición de esa área relativa al centro de masa debería darle una indicación de rotación.
  3. Usa un algoritmo de cuenca hidrográfica en las distancias de cada punto al borde blob. Esto puede ayudar a identificar la región delgada conectada (el pulgar).
  4. Ajuste el círculo más grande (o el polígono más grande inscrito) dentro del blob. Dilate este círculo o polígono hasta que una fracción de su borde se solape con el fondo. Reste esta figura dilatada de la imagen original; solo el pulgar permanecerá.
  5. Si el tamaño de la mano es constante (o relativamente consistente), entonces también podría realizar N operaciones morfológicas de erosión hasta que desaparezca el pulgar, luego N dilatar las operaciones para hacer que el puño vuelva a su tamaño original aproximado. Reste este blob de solo puño del blob original para obtener el blob del pulgar. Luego usa la dirección de la mancha del pulgar (diámetro de Feret) y/o el centro de masa en relación con el centro de masa de la masa del puño para determinar la dirección.

Las técnicas para encontrar puntos críticos (regiones de fuerte cambio de dirección) son más complicadas. En el más simple, también puede usar detectores de esquina y luego verificar la distancia de una esquina a otra para identificar el lugar cuando el borde interno del pulgar se encuentra con el puño.

Para métodos más complejos, consulte los documentos sobre la descomposición de formas de autores como Kimia, Siddiqi y Xiaofing Mi.

1

MatchTemplate parece una buena opción para el problema que describes. ¿De qué manera está fallando para ti? Si en realidad está enmascarando los signos de pulgar hacia arriba/pulgar hacia abajo/pulgar en medio tan bien como lo muestra en su imagen de muestra, entonces ya ha hecho la parte más difícil.

MatchTemplate no incluye rotación y escalado en el espacio de búsqueda, por lo que debe generar más plantillas de su imagen de referencia en todas las rotaciones que desea detectar, y debe escalar sus plantillas para que coincida con el tamaño general pulgares arriba/pulgares abajo signos.

[editar] La matriz de resultados para MatchTemplate contiene un valor entero que especifica qué tan bien el ajuste de la plantilla en la imagen se encuentra en esa ubicación. Si usa CV_TM_SQDIFF, entonces el valor más bajo en la matriz de resultados es la ubicación de mejor ajuste, si usa CV_TM_CCORR o CV_TM_CCOEFF, entonces es el valor más alto. Si las imágenes de plantilla escaladas y giradas tienen el mismo número de píxeles blancos, puede comparar el valor de mejor ajuste que encuentre para todas las imágenes de plantilla diferentes, y la imagen de plantilla que mejor se ajusta en general es la que desea seleccionar.

Hay un montón de funciones de detección independiente de rotación/escalado que podrían ayudarte, pero normalizar tu problema para trabajar con MatchTemplate es, con mucho, el más fácil.

Para la cosas más avanzadas, echa un vistazo a SIFT, Haar feature based classifiers, o one of the others available in OpenCV

+0

sí, las imágenes provistas son imágenes originales. es solo que, por ejemplo, la segunda imagen de patrón no tiene el mejor valor de coincidencia en comparación con la imagen de muestra. incluso cuando tienen casi el mismo tamaño que en la imagen. ¿Recomiendas un método especial matchtemplate (CV_TM_SQDIFF, ...)? ¿cuál es el valor que obtengo? error para la imagen completa? distancia por píxel (por lo que debo dividirlo por el tamaño de la imagen o algo así?) – Nicolas

+0

Actualicé mi respuesta para responder a sus preguntas. –

+0

Para una forma "elástica" como un puño, las plantillas de coincidencia pueden no funcionar siempre tan bien como te gustaría. La rotación, la escala y las transformaciones afines juntas no tienen en cuenta la rotación por partes y el estiramiento de los componentes individuales. Si una combinación de técnicas morfológicas y de segmentación no funciona, entonces considere buscar documentos sobre la "descomposición de la forma". – Rethunk

1

Creo que se puede obtener excelentes resultados si se acaba de calcular los dos puntos que tienen el camino más corto más alejado de pasar por blanco. La dirección en la que apunta el pulgar es simplemente la dirección de la línea que une los dos puntos.

Puede hacerlo fácilmente muestreando puntos en el área blanca y usando Floyd-Warshall.

+0

Esto suena como un enfoque interesante, pero ¿podrías elaborar más? No entiendo lo que quiere decir con "puntos de muestreo en el área blanca" y cómo podría usar ese algoritmo para gráficos para resolver nuestro problema – Nicolas

+1

Consulte este artículo, que describe bien la técnica: "Clasificación de formas usando el interno -Distancia "por Ling y Jacobs www.cs.umd.edu/~djacobs/pubs_files/ID-pami-8.pdf – Rethunk

Cuestiones relacionadas