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:

Image 0 Image 1 Image 2

Voici un exemple de résultat.

À remettre

  • Un notebook Mathematica (7 points)

    1. 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

    2. 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).

    3. 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.
Modifié le: jeudi 3 février 2011, 09:10