TNI+VO · Exercice de Programmation

EP02_10 — 🎯 Correction de perspective (homographie)

2.12.10 EP02_10 🎯 Correction de perspective (homographie)

Dans cette activité, vous devez implémenter la transformation de perspective, également connue sous le nom d’homographie. Contrairement aux transformations affines, la perspective ne préserve pas le parallélisme, ce qui permet de « redresser » des objets inclinés, comme des documents ou des panneaux capturés sous des angles obliques.

  • Lisez deux entiers L et C, représentant les dimensions de la matrice d’origine.
  • Lisez quatre paires de coordonnées \((x, y)\) représentant les coins du quadrilatère source (objet déformé).
  • Lisez quatre paires de coordonnées \((x, y)\) représentant les coins du quadrilatère de destination (là où l’objet doit être mappé).
  • Lisez les valeurs de la matrice d’origine.
  • Calculez la matrice d’homographie \(3 \times 3\) et appliquez la transformation.
  • Affichez la matrice résultante avec les dimensions de sortie spécifiées.
  • Voir dans Figure 2.21 une simulation de cet EP.

📌 Important :

  • Degrés de liberté : L’homographie possède 8 degrés de liberté (le neuvième élément de la matrice \(3 \times 3\) est une constante de normalisation, généralement 1), nécessitant au minimum 4 points correspondants pour être calculée.
  • Projection : Après avoir multiplié les coordonnées par la matrice, il est nécessaire de diviser les résultats \(x'\) et \(y'\) par la composante homogène \(w\) pour revenir au plan 2D.
  • Utilisation de bibliothèques : Pour cette tâche, vous pouvez utiliser les fonctions cv2.getPerspectiveTransform pour obtenir la matrice et cv2.warpPerspective pour appliquer la transformation, ou implémenter le système linéaire et le mappage inverse manuellement pour un défi supplémentaire.
# Dimensions de sortie : boîte englobante des points de destination + 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 🧠 Déformation non affine

Tandis que les transformations affines mappent des parallélogrammes en parallélogrammes, l’homographie mappe tout quadrilatère en un autre quadrilatère. Cela est essentiel pour la vision par ordinateur :

Opération Caractéristique Application typique
Homographie Projection sur un plan Correction de documents, numérisation de panneaux.
Point de fuite Convergence de lignes Reconstruction 3D à partir d’images 2D.
Warping Déformation de maillage Stabilisation vidéo et panoramas (stitching).

2.12.10.2 📌 Exemples

Entrée Sortie Observation
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
Les 4 premières lignes après les dimensions sont les points sources ; les 4 suivantes sont les destinations. Avec des points identiques, la transformation de perspective est l’identité et l’image est préservée.
📐 Simulateur EP02_10 : Correction de perspective (Homographie 3×3) p' = H · p

💡 Instructions : Faites glisser les 4 marqueurs aux coins du quadrilatère déformé. Cliquez sur Corriger la perspective pour mapper la région projetée en un rectangle aligné de 300×300 pixels.

Faites glisser les sommets rouges pour modifier la projection en perspective. L'homographie calcule la matrice H 3×3 qui redresse la région.
Figure 2.21: Simulateur EP02_10 : Correction de perspective (Transformation d’homographie 3×3)
%%writefile EP02_10.cpp
// your solution
Overwriting EP02_10.cpp
TestSuite("EP02_10.cpp").run()
✔️ EP02_10.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP02_10.cases

🔍 Test de C++ : EP02_10.cpp
⚠️ EP02_10.cpp : fichier vide (moins de 3 lignes). Tests ignorés.