💡 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.
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.getPerspectiveTransformpour obtenir la matrice etcv2.warpPerspectivepour 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
Faites glisser les sommets rouges pour modifier la projection en perspective. L'homographie calcule la matrice H 3×3 qui redresse la région.
%%writefile EP02_10.py
# Code PythonOverwriting EP02_10.py
TestSuite("EP02_10.py").run()✔️ EP02_10.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP02_10.cases
🔍 Test de Python : EP02_10.py
⚠️ EP02_10.py : fichier vide (moins de 3 lignes). Tests ignorés.