EDI+VA · Esercizio di Programmazione

EP02_10 — 🎯 Correzione della Prospettiva (Omografia)

2.12.10 EP02_10 🎯 Correzione della Prospettiva (Omografia)

In questa attività, devi implementare la trasformazione di prospettiva, nota anche come omografia. A differenza delle trasformazioni affini, la prospettiva non preserva il parallelismo, consentendo di “rettificare” oggetti inclinati, come documenti o targhe catturati da angolazioni oblique.

  • Leggi due interi L e C, che rappresentano le dimensioni della matrice originale.
  • Leggi quattro coppie di coordinate \((x, y)\) che rappresentano i vertici del quadrilatero di origine (oggetto distorto).
  • Leggi quattro coppie di coordinate \((x, y)\) che rappresentano i vertici del quadrilatero di destinazione (dove l’oggetto deve essere mappato).
  • Leggi i valori della matrice originale.
  • Calcola la matrice di omografia \(3 \times 3\) e applica la trasformazione.
  • Stampa la matrice risultante con le dimensioni di uscita specificate.
  • Vedi in Figura 2.21 una simulazione di questo EP.

📌 Importante:

  • Gradi di libertà: L’omografia possiede 8 gradi di libertà (il nono elemento della matrice \(3 \times 3\) è una costante di normalizzazione, generalmente 1), richiedendo almeno 4 punti corrispondenti per essere calcolata.
  • Proiezione: Dopo aver moltiplicato le coordinate per la matrice, è necessario dividere i risultati \(x'\) e \(y'\) per la componente omogenea \(w\) per tornare al piano 2D.
  • Uso di librerie: Per questo compito, puoi utilizzare le funzioni cv2.getPerspectiveTransform per ottenere la matrice e cv2.warpPerspective per applicare la trasformazione, oppure implementare manualmente il sistema lineare e la mappatura inversa per una sfida extra.
# Dimensioni di uscita: bounding box dei punti di destinazione + 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))
# oppure
dst = mm.perspective_transform(img, pts1, pts2, size=(w, h))

2.12.10.1 🧠 Deformazione non affine

Mentre le trasformazioni affini mappano parallelogrammi in parallelogrammi, l’omografia mappa qualsiasi quadrilatero in un altro quadrilatero. Questo è essenziale per la visione artificiale:

Operazione Caratteristica Applicazione Tipica
Omografia Proiezione su piano Correzione di documenti, scansione di targhe.
Punto di fuga Convergenza di linee Ricostruzione 3D da immagini 2D.
Warping Deformazione di mesh Stabilizzazione video e panoramiche (stitching).

2.12.10.2 📌 Esempi

Input Output Osservazione
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
Le prime 4 righe dopo le dimensioni sono i punti di origine; le 4 successive sono le destinazioni. Con punti identici, la trasformazione di prospettiva è l’identità e l’immagine viene preservata.
📐 Simulatore EP02_10: Correzione della Prospettiva (Omografia 3×3) p' = H · p

💡 Istruzioni: Trascina i 4 marcatori negli angoli del quadrilatero distorto. Clicca su Correggi Prospettiva per mappare la regione proiettata in un rettangolo allineato di 300×300 pixel.

Trascina i vertici rossi per modificare la proiezione prospettica. L'omografia calcola la matrice H 3×3 che raddrizza la regione.
Figura 2.21: Simulatore EP02_10: Correzione della Prospettiva (Trasformazione di Omografia 3×3)
%%writefile EP02_10.py
# Codice Python
Overwriting EP02_10.py
TestSuite("EP02_10.py").run()
✔️ EP02_10.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_10.cases

🔍 Test di Python: EP02_10.py
⚠️ EP02_10.py: file vuoto (meno di 3 righe). Test saltati.