Coincidencia de contornos: búsqueda de desplazamiento de contornos

17

Encontré contornos en dos imágenes con el mismo objeto y quiero encontrar el desplazamiento y la rotación de este objeto. He intentado con cuadros delimitadores rotados de estos contornos y luego sus ángulos y puntos centrales, pero las rotaciones de los cuadros delimitadores no indican la rotación del contorno correctamente porque es lo mismo para los ángulos a + 0, a + 90, a + 180, etc. grados ¿Es alguna otra buena manera de encontrar la rotación y el desplazamiento de los contornos? Tal vez algún uso de casco convexo, defectos de convexidad? Leí en Learning OpenCv sobre contornos coincidentes, pero no me ayudó. ¿Alguien podría dar algún ejemplo?

Ejemplos:

1 2 3 4 4

Quiero detectar, por ejemplo, un cuadrado rosa y, en el segundo caso, un bolígrafo. Otros ejemplos podrían ser cuadrados con algunos agujeros, estrellas, etc. Como dije, quiero hacer algo uniwersal. Cualquier sugerencia es apreciada porque quiero probar tantos métodos como sea posible.

krzych
fuente
La imagen ayudaría aquí
mirror2image
Quiero hacer alguna función universal. Entonces, como imagen de prueba puede ser cualquier cosa. Elemento de forma simple como rectángulo, o poco más complejo.
krzych
2
Bueno, no puedes adaptar un método único a todos los casos. El método práctico depende del rango de contraste, la estimación del ruido, el fondo y la forma en sí misma: es suavidad, topología, etc. Por eso la imagen ayudaría.
mirror2image

Respuestas:

4

¿Tiene que preocuparse por una diferencia de escala entre contornos? Si no es así, simplemente puede encontrar el centroide de cada contorno y calcular el desplazamiento restando uno del otro. Luego puede calcular los ejes principales de los contornos y encontrar el ángulo de rotación entre ellos.

Si está involucrado el escalado, puede calcular el factor de escala tomando la razón de los ejes principales correspondientes.

Dima
fuente
Sí, la escala también puede diferir. También pensé en algo similar a las cadenas de freeman de opencv haciendo cadenas de freeman de cada contorno y luego comparándolas e intentando encontrar la traducción de alguna manera, pero no puedo encontrar un buen algoritmo para ello.
krzych
Es lo mismo que crear un cuadro de límite giratorio mínimo y tomar su rotación y desplazamiento. Intenté este enfoque y los resultados no son satisfactorios. Así que creo que este método no es bueno en absoluto.
krzych
¿Puedes ser más específico en cuanto a por qué eso no funcionó? ¿Los contornos solo están relacionados por traslación, rotación y escala, o pueden deformarse de otras maneras? Algunas fotos realmente ayudarían. Si necesita manejar transformaciones no afines o ruido aleatorio, puede probar el contexto de forma. Déjame saber, puedo señalar algunos documentos.
Dima
Solo están relacionados por traslación, rotación y escala, las deformaciones están conectadas a la detección de contornos poco diferentes en diferentes fotos. Contexto de forma? ¿Podrías expandir esto?
krzych
1
@kzych Parece que su mayor problema aquí sería el ruido en la detección de bordes. ¿Cómo encuentras la caja rotada mínima? Todavía no estoy claro por qué eso no funciona bien. El contexto de forma es una forma de representar un contorno. Los detalles están aquí: en.wikipedia.org/wiki/Shape_context
Dima
2

Si no tiene que preocuparse por la escala o las distorsiones proyectivas, los códigos de cadena pueden ayudar aquí. Si tiene códigos de cadena de aproximadamente la misma forma con la misma escala, puede encontrar la traducción con la correlación de fase FFT unidimensional http://en.wikipedia.org/wiki/Phase_correlation

Si tiene que tener en cuenta la distorsión proyectiva, también puede considerar la posibilidad de utilizar puntos de características (como esquinas) en lugar de contornos.

mirror2image
fuente
¿Algún consejo sobre cómo construir un buen código de cadena? ¿Puede algo de OpenCv (que yo sepa, solo tiene cadenas de freeman)? Por ahora estoy construyendo códigos de cadena usando cada punto de contorno y calculando el ángulo al eje x de los puntos vecinos, pero ¿tal vez hay alguna idea mejor? Si tiene referencia a algún buen documento sobre cadenas, se lo agradeceríamos.
krzych
2

En la pregunta que dices

Como dije, quiero hacer algo uniwersal

pero me temo que es bastante difícil encontrar una solución "universal" al problema.

Puede comprar un software localizador de patrones disponible comercialmente e integrarlo en su aplicación, por lo general, funcionan bastante bien para una amplia gama de aplicaciones. Solo para darle una idea, este es el manual de referencia para dicho producto http://www.lmi3d.com/sites/default/files/support/4.2.0.70-hexsight_user_guide.pdf

Además, puede desarrollar una solución ad hoc para algún caso particular (por ejemplo, para el lápiz en su imagen).

De lo contrario, puede estudiar mucho el problema, comenzando por los fundamentos muy básicos enraizados en la geometría computacional ( http://www.cs.sunysb.edu/~algorith/files/shape-similarity.shtml ), donde se llaman sus "contornos" "polígono", leyendo cosas como:

M. de Berg, O. Devillers, M. Kreveld, O. Schwarzkopf y M. Teillaud. Calcular la superposición máxima de dos polígonos convexos bajo traslaciones. Informática teórica, 31: 613-628, 1998.

y

H. Ahn, O. Cheong, C. Park, C. Shin y A. Vigneron. Maximización de la superposición de dos conjuntos convexos planos bajo movimientos rígidos. Geometría computacional: teoría y aplicaciones, 37: 3–15, 2007.

y termina con "Reconocimiento jerárquico en tiempo real de objetos compuestos en imágenes" por Markus Ulrich, que colabora con MVTec , otra casa de software que vende herramientas de software de reconocimiento de objetos.

Alessandro Jacopson
fuente