with rectangle recortar imagen from opencv contour

rectangle - Imagen de contorno de partido de Opencv



trim image opencv (1)

Bueno, para esto tienes un par de opciones dependiendo de cuán robusto necesitas que sea tu enfoque.

Soluciones simples (con suposiciones):

Para estos métodos, asumo que las imágenes que suministró son con las que está trabajando (es decir, los objetos ya están segmentados y tienen aproximadamente la misma escala. Además, deberá corregir la rotación (al menos de manera aproximada). Podría hacer algo así como rotar iterativamente la imagen de comparación cada 10, 30, 60 o 90 grados, o cualquier aspereza que sienta que puede salirse con la suya.

Por ejemplo,

for(degrees = 10; degrees < 360; degrees += 10) coinRot = rotate(compareCoin, degrees) // you could also try Cosine Similarity, or even matchedTemplate here. metric = SAD(coinRot, targetCoin) if(metric > bestMetric) bestMetric = metric coinRotation = degrees

  • Suma de diferencias absolutas (SAD) : Esto le permitirá comparar rápidamente las imágenes una vez que haya determinado un ángulo de rotación aproximado.
  • Similitud de coseno : funciona de forma un poco diferente al tratar la imagen como un vector 1D, y luego calcula el ángulo de alta dimensión entre los dos vectores. Cuanto mejor sea el partido, menor será el ángulo.

Soluciones complejas (posiblemente más robustas):

Estas soluciones serán más complejas de implementar, pero probablemente arrojen clasificaciones más sólidas.

  • Distancia de Haussdorf : esta respuesta le dará una introducción sobre el uso de este método. Esta solución probablemente también necesite la corrección de rotación para funcionar correctamente.
  • Transformada de Fourier-Mellin : este método es una extensión de la Correlación de fase, que puede extraer la transformación de rotación, escala y traducción (RST) entre dos imágenes.
  • Detección y extracción de características : Este método implica la detección de características "robustas" (es decir, invariantes de escala y / o de rotación) en la imagen y su comparación con un conjunto de características de destino con RANSAC, LMedS o mínimos cuadrados simples. OpenCV tiene un par de muestras que usan esta técnica en matcher_simple.cpp y matching_to_many_images.cpp . NOTA: con este método, probablemente no desee binarizar la imagen, por lo que hay más funciones detectables disponibles.

Me gustaría saber cuál sería la mejor estrategia para comparar un grupo de contornos, de hecho son los bordes resultantes de una detección de bordes astutos, a partir de dos imágenes, para saber qué par es más parecido.

Tengo esta imagen:

http://i55.tinypic.com/10fe1y8.jpg

Y me gustaría saber cómo puedo calcular cuál de ellos le queda mejor:

http://i56.tinypic.com/zmxd13.jpg

(debe ser el de la derecha)

¿Hay alguna forma de comparar los contornos como un todo? Puedo rotar fácilmente las imágenes pero no sé qué funciones usar para calcular que la imagen de referencia a la derecha es la que mejor se adapta.

Aquí es lo que ya he intentado usando opencv:

función MatchShapes - Intenté esta función usando 2 escalas de grises y siempre obtengo el mismo resultado en cada imagen de comparación y el valor parece incorrecto ya que es 0,0002.

Entonces, lo que descubrí sobre matchShapes, pero no estoy seguro de que sea la suposición correcta, es que la función funciona con pares de contornos y no con imágenes completas. Ahora esto es un problema porque, aunque tengo los contornos de las imágenes que quiero comparar, son cientos y no sé cuáles deberían estar "emparejados".

Así que también traté de comparar todos los contornos de la primera imagen con los otros dos con una para la iteración, pero podría estar comparando, por ejemplo, el contorno del 5 con el contorno del círculo de las dos imágenes de referencia y no el contorno 2.

También probé la función simple cv :: compare y matchTemplate, ninguna con éxito.