PDI+VC · Ejercicio de Programación

EP02_10 — 🎯 Corrección de Perspectiva (Homografía)

2.12.10 EP02_10 🎯 Corrección de Perspectiva (Homografía)

En esta actividad, debes implementar la transformación de perspectiva, también conocida como homografía. A diferencia de las transformaciones afines, la perspectiva no preserva el paralelismo, permitiendo “rectificar” objetos inclinados, como documentos o placas capturados en ángulos oblicuos.

  • Lee dos enteros L y C, que representan las dimensiones de la matriz original.
  • Lee cuatro pares de coordenadas \((x, y)\) que representan las esquinas del cuadrilátero de origen (objeto distorsionado).
  • Lee cuatro pares de coordenadas \((x, y)\) que representan las esquinas del cuadrilátero de destino (donde se debe mapear el objeto).
  • Lee los valores de la matriz original.
  • Calcula la matriz de homografía \(3 \times 3\) y aplica la transformación.
  • Imprime la matriz resultante con las dimensiones de salida especificadas.
  • Consulta en Figura 2.21 una simulación de este EP.

📌 Importante:

  • Grados de libertad: La homografía posee 8 grados de libertad (el noveno elemento de la matriz \(3 \times 3\) es una constante de normalización, generalmente 1), lo que requiere al menos 4 puntos correspondientes para calcularse.
  • Proyección: Después de multiplicar las coordenadas por la matriz, es necesario dividir los resultados \(x'\) e \(y'\) por la componente homogénea \(w\) para regresar al plano 2D.
  • Uso de bibliotecas: Para esta tarea, puedes utilizar las funciones cv2.getPerspectiveTransform para obtener la matriz y cv2.warpPerspective para aplicar la transformación, o implementar el sistema lineal y el mapeo inverso manualmente para un desafío adicional.
# Dimensiones de salida: bounding box de los puntos destino + 1
w = int(max(pts2[:, 0])) + 1;  h = int(max(pts2[:, 1])) + 1
# M = cv2.getPerspectiveTransform(pts1, pts2)
# dst = cv2.warpPerspective(img, M, (w, h))
# o
dst = mm.perspective_transform(img, pts1, pts2, size=(w, h))

2.12.10.1 🧠 Deformación no afín

Mientras que las transformaciones afines mapean paralelogramos en paralelogramos, la homografía mapea cualquier cuadrilátero en otro cuadrilátero. Esto es esencial para la visión por computadora:

Operación Característica Aplicación típica
Homografía Proyección en plano Corrección de documentos, escaneo de placas.
Punto de fuga Convergencia de líneas Reconstrucción 3D a partir de imágenes 2D.
Warping Deformación de malla Estabilización de video y panoramas (stitching).

2.12.10.2 📌 Ejemplos

Entrada Salida Observación
4 4
0 0
3 0
0 3
3 3
0 0
3 0
0 3
3 3
10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160
10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160
Las 4 primeras líneas después de las dimensiones son los puntos de origen; las 4 siguientes son los destinos. Con puntos idénticos, la transformación de perspectiva es la identidad y la imagen se preserva.
📐 Simulador EP02_10: Corrección de Perspectiva (Homografía 3×3) p' = H · p

💡 Instrucciones: Arrastra los 4 marcadores en las esquinas del cuadrilátero distorsionado. Haz clic en Corregir Perspectiva para mapear la región proyectada en un rectángulo alineado de 300×300 píxeles.

Arrastra los vértices rojos para cambiar la proyección en perspectiva. La homografía calcula la matriz H 3×3 que rectifica la región.
Figura 2.21: Simulador EP02_10: Corrección de Perspectiva (Transformación de Homografía 3×3)
%%writefile EP02_10.cpp
// your solution
Overwriting EP02_10.cpp
TestSuite("EP02_10.cpp").run()
✔️ EP02_10.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_10.cases

🔍 Probando C++: EP02_10.cpp
⚠️ EP02_10.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.