OpenCV, Python: elimina el posible estrechamiento al coser imágenes

Gracias, en gran parte, a algunas excelentes respuestas sobre stackoverflow ( aquí , aquí y aquí ) He tenido bastante éxito al alinear imágenes. Sin embargo, hay un problema, como se puede ver a continuación. Cuando coso muchas imágenes juntas, se vuelven más y más pequeñas.

Mi teoría sobre por qué sucede esto es que la cámara no era exactamente perpendicular al suelo, así que a medida que agregué más y más imágenes, la perspectiva natural de tener una cámara no perpendicular al suelo hizo que las imágenes lejanas se volvieran más pequeñas. Sin embargo, esto podría ser completamente incorrecto.

Sin embargo, incluso cuando transformo la primera imagen de modo que sea “como si” se tomara perpendicular al suelo (creo), la distorsión todavía ocurre.

¿La shiny comunidad de stackoverflow tiene alguna idea sobre cómo puedo remediar la situación?

Este es el proceso que utilizo para coser las imágenes:

  1. Usando el conocimiento de los puntos latentes / largos de la esquina de las imágenes, deforme de manera que la primera imagen sea perpendicular al suelo. La homografía que uso para hacer esto es la homografía “base”.
  2. Encuentre características comunes entre cada imagen y la última usando goodFeaturesToTrack() y calcOpticalFlowPyrLK()
  3. Use findHomography() para encontrar la homografía entre las dos imágenes. Luego, componga esa homografía con todas las homografías anteriores para obtener la homografía “neta”.
  4. Aplique la transformación y superponga la imagen con el resultado neto de lo que he hecho hasta ahora.

Hay una restricción importante

El mosaico se debe construir una imagen a la vez, a medida que la cámara se mueve. Estoy tratando de crear un mapa en tiempo real mientras un drone está volando, ajustando cada imagen con la última, una por una.

introduzca la descripción de la imagen aquí

Mi teoría sobre por qué sucede esto es que la cámara no era exactamente perpendicular al suelo.

Esta es una buena intuición. Si la cámara está inclinada, a medida que se mueve hacia un objeto, ese objeto se hace más grande en el marco. Entonces, si está uniendo eso al marco anterior, el marco actual debe reducirse para ajustarse al objeto en el marco anterior.

Las homografías completas de 3x3 incluyen distorsiones en las direcciones x e y , pero las transformaciones afines de 2x3 no lo hacen. Para seguir con su tubería actual, puede intentar encontrar una transformación afín o euclidiana (rígida) en su lugar. La diferencia entre ellos es que una urdimbre afín permite el cizallamiento y el estiramiento por separado en las direcciones x e y , las transformaciones euclidianas solo hacen traslación, rotación y escala uniforme. Ambos conservan líneas paralelas, mientras que una homografía completa no lo hace, por lo que podría terminar con una imagen cuadrada que se vuelva más trapezoidal y se repita para reducir su imagen. Una urdimbre afín todavía puede reducirse en una sola dirección, convirtiendo un cuadrado en un rectángulo para que aún pueda reducirse. Las transformaciones euclidianas solo pueden escalar todo el cuadrado, por lo que aún podría reducirse.

Por supuesto, tampoco serán coincidencias perfectas como findHomography , pero deberían poder hacer que cierres las coincidencias sin distorsionar tanto el tamaño. Hay dos opciones para encontrar transformaciones euclidianas o afines con OpenCV:

  1. warpPerspective() en lugar de warpPerspective() para obtener un warp rígido con el parámetro fullAffine=False o un warp fullAffine=True con fullAffine=True .

  2. findTransformECC() con el parámetro opcional motionType=cv2.MOTION_EUCLIDEAN o motionType=cv2.MOTION_AFFINE (pero afín es el valor predeterminado, por lo que no es necesario especificar).

Puede consultar la diferencia entre los algoritmos en sus páginas de documentación, o probar los dos para ver cuál funciona mejor para usted.

Si esto no funciona también, puedes intentar estimar la homografía que deforma un marco para que sea completamente perpendicular al suelo. Si lo hace, puede intentar aplicarlo a todos los marcos primero y luego hacer coincidir las imágenes. De lo contrario, probablemente querrá pasar a métodos más avanzados que encontrar solo una homografía entre cada cuadro.