TP1: Mosaïque
Début Jeudi le 20 janvier 2011
Remise Vendredi 4 février 2011
Description
Soit plusieurs photos prises par une caméra sur un trépied
fixe (autrement dit, seule la rotation change). L'objectif de ce travail
pratique est la construction automatique d'une mosaïque. La construction d'une mosaïque se fait en plusieurs étapes:
- Détecter des points saillants dans chacune des images.
- Mettre en correspondance des points saillants entre deux images consécutives (images 0 et 1, images 1 et 2, ...).
- Calculer les homographies entre les vues 0-1, 1-2, 2-3, ... Donc vous aurez: H01,H12,H23,...
- Reprojeter les images sur une des vues de caméra au choix en utilisant les homographies.
Nous verrons au prochain cours pratique (lundi 24 janvier)
comment résoudre une homographie à partir d'un minimum de 4
correspondances. En pratique, le nombre de correspondances trouvées est
plus élevé et vous devrez utiliser la méthode RANSAC pour trouver les
correspondances valides et les homographies.
Bien que vous soyez libres d'utiliser vos propres images, voici 3 images test:
Voici un exemple de résultat.
À remettre
-
Un notebook Mathematica (7 points)
- Fonctions (2 points)
Implémentez les deux fonctions suivantes:
- Calcul d'une homographie à partir de points correspondants
- Estimation robuste d'une homographie à l'aide de RANSAC pour éliminer les mauvaises correspondances
- Partie synthétique (3 points)
Utilisez des points synthétiques pour tester vos fonctions d'homographie et de RANSAC. Par exemple, générez au moins un des cas suivants:
- une homographie H aléatoire et un ensemble de points saillants pi à partir desquels les points correspondants qi = H pi peuvent être calculés.
- des points 3D Pwi et deux caméras P1 et
P2 ayant le même centre optique (autrement dit, la même position mais
des orientations différentes). Les points correspondants peuvent ensuite
être calculés par les projections p1i = P1 * Pwi et p2i = P2 * Pwi.
Ensuite, vérifiez la robustesse de vos fonctions en ajoutant :
- du bruit sur la position des points en correspondance
- des correspondances erronnées
Montrez les erreurs algébriques et géométriques en fonction du degré de bruit ou de mauvaises correspondances (selon le cas).
- Partie pratique (2 points)
Construisez une mosaïque à partir d'images basse résolution (utilisez
au minimum les images 'labo'). Vous pouvez utiliser les fonctions:
- ImageKeypoints pour extraire des points saillants
- ImageCorrespondingPoints pour trouver les correspondances
- ImagePerspectiveTransformation pour appliquer aux images les homographies estimées
-
Une application en C/C++ avec la librarie OpenCV (3 points)
L'application doit pouvoir construire une mosaïque à partir d'images
haute résolution (utilisez au minimum les images 'automne').
Pour ce faire, vous pouvez utiliser la librairie OpenCV sans
restriction. En particulier, vous n'avez pas besoin de réimplémenter les
fonctions d'estimation d'homographie et de RANSAC puisque des fonctions
OpenCV équivalentes existent (voir ci-dessous). Voici quelques pointeurs vers des fonctions et exemples qui vous aideront à faire le travail pratique :
- Pour la détection de points saillants, voir l'exemple : matcher_simple qui utilise les descripteurs SURF pour effectuer la détection et la mise en correspondance.
- Utilisez avec soin la classe BruteForceMatcher<
L2<float> >, qui fait la mise en correspondance entre points
saillants (la mise en correspondance se fait selon la distance entre
descripteurs). Vous pouvez utiliser la méthode match
qui retourne le point saillant le plus proche, et imposer un seuil sur
la distance entre les deux. D'autres méthodes seront présentées dans le
cours sur les points saillants.
- Pour trouver les homographies, vous pouvez utiliser la fonction findHomography avec l'option CV_RANSAC.
- Pour construire la mosaïque, trouvez d'abord la taille
de l'image sur laquelle faire la reprojection. Ensuite, utilisez la
fonction warpPerspective pour effectuer la transformation d'une image vers la mosaïque. Bien lire
la documentation pour vérifier si le paramètre est l'homographie
directe ou son inverse (faites attention à l'option WARP_INVERSE_MAP).
Pour une meilleure interpolation, utilisez l'option INTER_CUBIC. Pour éviter que la mosaïque soit réinitialisée à noir entre chaque appel, utilisez l'option BORDER_TRANSPARENT.
|