La Torre de Babel, según un relato mítico de la Biblia, fue el primer desastre de ingeniería de los humanos. El proyecto tenía todas las grandes cualidades de tener una misión clara, mucha fuerza humana, ninguna limitación de tiempo y una tecnología adecuada ( ladrillos y mortero ). Sin embargo, fracasó estrepitosamente porque Dios confundió el lenguaje de los trabajadores humanos y ya no pudieron comunicarse.
Términos como «Homografía» me recuerdan a menudo cómo seguimos luchando con la comunicación. La homografía es un concepto sencillo con un nombre extraño.
- ¿Qué es la homografía?
- Alineación de Imágenes Usando Homografía
- Panorama : Una aplicación de la Homografía
- ¿Cómo calcular una Homografía?
- Ejemplo de homografía en C++ de OpenCV
- Ejemplo de Homografía de OpenCV Python
- Aplicaciones de la Homografía
- Corrección de perspectiva mediante Homografía
- Valla publicitaria virtual
- Suscríbete &Descarga el código
¿Qué es la homografía?
Considere dos imágenes de un plano (parte superior del libro) que se muestran en la figura 1. El punto rojo representa el mismo punto físico en las dos imágenes. En la jerga de la visión por ordenador los llamamos puntos correspondientes. La Figura 1. muestra cuatro puntos correspondientes en cuatro colores diferentes: rojo, verde, amarillo y naranja. Una Homografía es una transformación ( una matriz de 3×3 ) que mapea los puntos de una imagen a los puntos correspondientes de la otra imagen.
Ahora bien, como una homografía es una matriz de 3×3 podemos escribirla como
Consideremos el primer conjunto de puntos correspondientes – en la primera imagen y en la segunda imagen. Entonces, la Homografía los mapea de la siguiente manera
Alineación de Imágenes Usando Homografía
La ecuación anterior es verdadera para TODOS los conjuntos de puntos correspondientes siempre y cuando se encuentren en el mismo plano en el mundo real. En otras palabras, puedes aplicar la homografía a la primera imagen y el libro de la primera imagen se alineará con el libro de la segunda imagen. Ver Figura 2.
¿Pero qué pasa con los puntos que no están en el plano? Pues bien, NO se alinearán mediante una homografía como puedes ver en la Figura 2. Pero espera, ¿qué pasa si hay dos planos en la imagen? Bueno, entonces tienes dos homografías – una para cada plano.
Panorama : Una aplicación de la Homografía
En la sección anterior, aprendimos que si se conoce una homografía entre dos imágenes, podemos deformar una imagen sobre la otra. Sin embargo, había una gran advertencia. Las imágenes tenían que contener un plano ( la parte superior de un libro), y sólo la parte plana se alineaba correctamente. Resulta que si se hace una foto de cualquier escena ( no sólo de un plano ) y luego se hace una segunda foto girando la cámara, ¡las dos imágenes están relacionadas por una homografía! En otras palabras, puedes montar tu cámara en un trípode y hacer una foto. A continuación, haz una panorámica sobre el eje vertical y toma otra foto. Las dos imágenes que acabas de tomar de una escena 3D completamente arbitraria están relacionadas por una homografía. Las dos imágenes compartirán algunas regiones comunes que se pueden alinear y unir y, bingo, tienes una panorámica de dos imágenes. ¿Es realmente tan fácil? No. (siento decepcionarle) Hay mucho más que hacer para crear una buena panorámica, pero el principio básico es alinear usando una homografía y coser inteligentemente para que no se vean las costuras. La creación de panorámicas será definitivamente parte de un futuro post.
¿Cómo calcular una Homografía?
Para calcular una homografía entre dos imágenes, necesitas conocer al menos 4 puntos correspondientes entre las dos imágenes. Si tienes más de 4 puntos correspondientes, es aún mejor. OpenCV estimará de forma robusta una homografía que se ajuste lo mejor posible a todos los puntos correspondientes. Por lo general, estas correspondencias de puntos se encuentran de forma automática mediante la coincidencia de características como SIFT o SURF entre las imágenes, pero en este post simplemente vamos a pulsar los puntos a mano.
Veamos primero el uso.
C++
Python
Veamos un ejemplo más completo tanto en C++ como en Python.
Ejemplo de homografía en C++ de OpenCV
Las imágenes de la Figura 2. se pueden generar utilizando el siguiente código C++. El código siguiente muestra cómo tomar cuatro puntos correspondientes en dos imágenes y deformar la imagen sobre la otra.
Ejemplo de Homografía de OpenCV Python
Las imágenes de la Figura 2. también se pueden generar utilizando el siguiente código Python. El código siguiente muestra cómo tomar cuatro puntos correspondientes en dos imágenes y deformar la imagen sobre la otra.
Aplicaciones de la Homografía
La aplicación más interesante de la Homografía es, sin duda, la realización de panoramas ( a.k.a image mosaicing and image stitching ). Los panoramas serán objeto de un post posterior. Veamos otras aplicaciones interesantes.
Corrección de perspectiva mediante Homografía
Supongamos que tienes una foto que se muestra en la figura 1. No sería genial si pudieras hacer clic en las cuatro esquinas del libro y obtener rápidamente una imagen que se parezca a la que se muestra en la Figura 3. Puedes obtener el código de este ejemplo en la sección de descargas de abajo. Estos son los pasos.
- Escribe una interfaz de usuario para recoger las cuatro esquinas del libro. Vamos a llamar a estos puntos pts_src
- Necesitamos saber la relación de aspecto del libro. Para este libro, la relación de aspecto ( anchura / altura ) es de 3/4. Así que podemos elegir el tamaño de la imagen de salida para ser 300×400, y nuestros puntos de destino ( pts_dst ) para ser (0,0), (299,0), (299,399) y (0,399)
- Obtener la homografía utilizando pts_src y pts_dst .
- Aplicar la homografía a la imagen de origen para obtener la imagen en la Figura 3.
Valla publicitaria virtual
En muchos eventos deportivos televisados, la publicidad en virtualmente insertada en la transmisión de video en vivo. Por ejemplo, en el fútbol y el béisbol, los anuncios colocados en pequeños paneles publicitarios justo fuera de los límites del campo pueden cambiarse virtualmente. En lugar de mostrar el mismo anuncio a todo el mundo, los anunciantes pueden elegir qué anuncios mostrar en función de los datos demográficos de la persona, su ubicación, etc. En estas aplicaciones se detectan en el vídeo las cuatro esquinas del tablero publicitario que sirven como puntos de destino. Las cuatro esquinas del anuncio sirven como puntos de origen. Se calcula una homografía basada en estos cuatro puntos correspondientes y se utiliza para deformar el anuncio en el cuadro de vídeo.
Después de leer este post probablemente tengas una idea de cómo poner una imagen en una valla publicitaria virtual. La figura 4. muestra la primera imagen subida a internet.
Y la Figura 5. muestra El Times Square.
Podemos sustituir una de las vallas publicitarias de The Times Square por la imagen que queramos. Aquí están los pasos.
- Escribir una interfaz de usuario para recoger las cuatro esquinas de la cartelera en la imagen. Llamemos a estos puntos pts_dst
- Deja que el tamaño de la imagen que quieres poner en la cartelera virtual sea w x h. Las esquinas de la imagen ( pts_src ) serán por tanto (0,0), (w-1,0), (w-1,h-1) y (0,h-1)
- Obtén la homografía usando pts_src y pts_dst .
- Aplique la homografía a la imagen de origen y mézclela con la imagen de destino para obtener la imagen de la Figura 6.
Nótese que en la Figura 6. hemos insertado la imagen mostrada en la Figura 4. en la Imagen de Times Square.
Suscríbete &Descarga el código
Si te ha gustado este artículo y quieres descargar el código (C++ y Python) y las imágenes de ejemplo utilizadas en este post, suscríbete a nuestro boletín. También recibirás una guía gratuita de recursos de Visión por Computador. En nuestro boletín compartimos tutoriales y ejemplos de OpenCV escritos en C++/Python, y algoritmos y noticias de Visión por Computador y Aprendizaje Automático.
Suscríbete ahora
Créditos de la imagen
- La imagen de la Figura 4. fue la primera imagen fotográfica subida a Internet. Se califica como uso justo.
- La imagen utilizada en la Figura 5. ( La Plaza del Tiempo ) está licenciada bajo la GFDL.