Matriz de Homografía en OpenCV: Ejemplo Práctico 18

1 Introducción

1.1 ¿Qué es la homografía? 1.2 Alineación de imágenes mediante homografía 1.3 Aplicaciones de la homografía: Mosaico panorámico

2 Cálculo de la homografía

3 Resumen

4 Referencias

La historia bíblica del edificio de Babel ilustra cómo la falta de comunicación puede frustrar planes ambiciosos. Este concepto se relaciona con el término "homografía", que aunque suena complejo, representa un concepto fundamental en visión por computadora.

1 Introduccción

1.1 ¿Qué es la homografía?

Imagínese dos imágenes de una superficie plana (por ejemplo, una revista). Los puntos rojos representan coordenadas físicas correspondientes entre ambas imágenes. En términos de visión por computadora, estos son puntos de correspondencia.

La homografía es una matriz 3x3 que mapea puntos de una imagen a sus correspondientes en otra imagen. Matemáticamente se representa como:

Considerando un conjunto de puntos de correspondencia, la homografía opera de la siguiente manera:

1.2 Alineación de imágenes mediante homografía

Esta relación es válida para todos los puntos que estén en el mismo plano del mundo real. Por ejemplo, al aplicar la homografía a una imagen de libro, se alineará con la imagen correspondiente del mismo libro. Sin embargo, puntos fuera de este plano (como mesas o pisos) no se alinearán correctamente. Para escenas con múltiples planos, se requiere aplicar distintas homografías por cada superficie.

1.3 Aplicaciones de la homografía: Mosaico panorámico

Al conocer la homografía entre dos imágenes, es posible mapear una imagen a la otra. Esto es especialmente útil para escenas con múltiples planos. Al rotar la cámara y capturar imágenes, sus regiones comunes pueden alinearse para crear un mosaico panorámico. Este proceso básico utiliza la homografía y técnicas de fusión inteligente.

2 Cálculo de la homografía

Para estimar la homografía entre dos imágenes se necesitan al menos 4 puntos de correspondencia. Si se disponen de más puntos, el cálculo será más robusto. La matriz H tiene 8 grados de libertad, por lo que se requieren 8 ecuaciones. Cada par de puntos proporciona 2 ecuaciones. OpenCV calcula la homografía óptima para todos los puntos. El código siguiente muestra el proceso:

C++:

// Ejemplo_Homografia.cpp
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main() {
    Mat srcImage = imread("./image/libro2.jpg");
    vector<Point2f> srcPoints = {{141, 131}, {480, 159}, {493, 630}, {64, 601}};
    
    Mat dstImage = imread("./image/libro1.jpg");
    vector<Point2f> dstPoints = {{318, 256}, {534, 372}, {316, 670}, {73, 473}};
    
    Mat homography = findHomography(srcPoints, dstPoints);
    
    Mat result;
    warpPerspective(srcImage, result, homography, dstImage.size());
    
    imshow("Imagen Original", srcImage);
    imshow("Imagen Destino", dstImage);
    imshow("Imagen Transformada", result);
    waitKey(0);
    return 0;
}

Python:

import cv2
import numpy as np

if __name__ == '__main__':
    src = cv2.imread('./image/libro2.jpg')
    src_pts = np.array([[141, 131], [480, 159], [493, 630], [64, 601]])
    
    dst = cv2.imread('./image/libro1.jpg')
    dst_pts = np.array([[318, 256], [534, 372], [316, 670], [73, 473]])
    
    H, _ = cv2.findHomography(src_pts, dst_pts)
    output = cv2.warpPerspective(src, H, (dst.shape[1], dst.shape[0]))
    
    cv2.imshow("Imagen Original", src)
    cv2.imshow("Imagen Destino", dst)
    cv2.imshow("Resultado", output)
    cv2.waitKey(0)

3 Resumen

Para insertar un anuncio virtual en una imagen, siga estos pasos:

  1. Seleccionar 4 puntos en la imagen de destino (por ejemplo, esquinas de un cartel)
  2. Definir puntos de referencia en la imagen de origen (0,0), (ancho-1, 0), etc.
  3. Calcular la homografía con findHomography
  4. Aplicar la transformación perspecitva a la imagen de origen

Este proceso se puede implementar con código similar al mostrado en el ejemplo.

4 Referencias

https://www.learnopencv.com/homography-examples-using-opencv-python-c/https://blog.csdn.net/baishuo8/article/details/80777995

Etiquetas: opencv Homografía procesamiento de imágenes Transformación Perspectiva Alineación de Imágenes

Publicado el 9-8 19:03