PDI+VC · Exercício de Programação

EP02_10 — 🎯 Correção de Perspectiva (Homografia)

2.12.10 EP02_10 🎯 Correção de Perspectiva (Homografia)

Nesta atividade, você deve implementar a transformação de perspectiva, também conhecida como homografia. Diferente das transformações afins, a perspectiva não preserva o paralelismo, permitindo “retificar” objetos inclinados, como documentos ou placas capturados em ângulos oblíquos.

  • Leia dois inteiros L e C, representando as dimensões da matriz original.
  • Leia quatro pares de coordenadas \((x, y)\) representando os cantos do quadrilátero de origem (objeto distorcido).
  • Leia quatro pares de coordenadas \((x, y)\) representando os cantos do quadrilátero de destino (onde o objeto deve ser mapeado).
  • Leia os valores da matriz original.
  • Calcule a matriz de homografia \(3 \times 3\) e aplique a transformação.
  • Imprima a matriz resultante com as dimensões de saída especificadas.
  • Ver na Figura 2.21 uma simulação deste EP.

📌 Importante:

  • Graus de Liberdade: A homografia possui 8 graus de liberdade (o nono elemento da matriz \(3 \times 3\) é uma constante de normalização, geralmente 1), exigindo no mínimo 4 pontos correspondentes para ser calculada.
  • Projeção: Após multiplicar as coordenadas pela matriz, é necessário dividir os resultados \(x'\) e \(y'\) pela componente homogênea \(w\) para retornar ao plano 2D.
  • Uso de Bibliotecas: Para esta tarefa, você pode utilizar as funções cv2.getPerspectiveTransform para obter a matriz e cv2.warpPerspective para aplicar a transformação, ou implementar o sistema linear e o mapeamento inverso manualmente para um desafio extra.
# Dimensões de saída: bounding box dos pontos 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))
# ou
dst = mm.perspective_transform(img, pts1, pts2, size=(w, h))

2.12.10.1 🧠 Deformação não-afim

Enquanto transformações afins mapeiam paralelogramos em paralelogramos, a homografia mapeia qualquer quadrilátero em outro quadrilátero. Isso é essencial para visão computacional:

Operação Característica Aplicação Típica
Homografia Projeção em plano Correção de documentos, escaneamento de placas.
Ponto de Fuga Convergência de linhas Reconstrução 3D a partir de imagens 2D.
Warping Deformação de malha Estabilização de vídeo e panoramas (stitching).

2.12.10.2 📌 Exemplos

Entrada Saída Observação
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
As 4 primeiras linhas após as dimensões são os pontos de origem; as 4 seguintes são os destinos. Com pontos idênticos, a transformação de perspectiva é a identidade e a imagem é preservada.
📐 Simulador EP02_10: Correção de Perspectiva (Homografia 3×3) p' = H · p

💡 Instruções: Arraste os 4 marcadores nos cantos do quadrilátero distorcido. Clique em Corrigir Perspectiva para mapear a região projetada em um retângulo alinhado de 300×300 pixels.

Arraste os vértices vermelhos para alterar a projeção perspectiva. A homografia calcula a matriz H 3×3 que retifica a região.
Figura 2.21: Simulador EP02_10: Correção de Perspectiva (Transformação de Homografia 3×3)
%%writefile EP02_10.py
# Código Python
Overwriting EP02_10.py
TestSuite("EP02_10.py").run()
✔️ EP02_10.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_10.cases

🔍 Testando Python: EP02_10.py
⚠️ EP02_10.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.