Aprende OpenCV

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?

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.

Figura 1 : Dos imágenes de un plano 3D ( parte superior del libro ) están relacionadas por una Homografía

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.

Figura 2 : Una imagen de un plano 3D puede ser alineada con otra imagen del mismo plano utilizando la Homografía

¿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

Figura 3. Corrección de la perspectiva

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.

  1. Escribe una interfaz de usuario para recoger las cuatro esquinas del libro. Vamos a llamar a estos puntos pts_src
  2. 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)
  3. Obtener la homografía utilizando pts_src y pts_dst .
  4. Aplicar la homografía a la imagen de origen para obtener la imagen en la Figura 3.
Puedes descargar el código y las imágenes utilizadas en este post suscribiéndote a nuestro boletín de noticias aquí.

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.

Figura 4. Primera imagen subida a internet.

Y la Figura 5. muestra El Times Square.

Figura 5. The Times Square
Puedes descargar el código (C++ & Python) y las imágenes utilizadas en este ejemplo y en otros ejemplos de este post suscribiéndote a nuestro boletín aquí.

Podemos sustituir una de las vallas publicitarias de The Times Square por la imagen que queramos. Aquí están los pasos.

  1. Escribir una interfaz de usuario para recoger las cuatro esquinas de la cartelera en la imagen. Llamemos a estos puntos pts_dst
  2. 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)
  3. Obtén la homografía usando pts_src y pts_dst .
  4. 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.

Figura 6. Cartelera virtual. Se ha sustituido una de las vallas publicitarias de la izquierda por una imagen de nuestra elección.

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

  1. La imagen de la Figura 4. fue la primera imagen fotográfica subida a Internet. Se califica como uso justo.
  2. La imagen utilizada en la Figura 5. ( La Plaza del Tiempo ) está licenciada bajo la GFDL.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.