espace

Maîtrise d'informatique - Module 11
Vision par ordinateur - Travaux pratiques



Séance 3 :

  • 1. Introduction.
  • 2. Détermination de la matrice H.
  • 3. Réalisation de la mosaïque.

  • 1. Introduction.

    Le but de cette troisième et dernière séance de travaux pratiques est d'illustrer le chapitre 4 du cours, dans le cas particulier où le centre optique de la caméra subit un déplacement nul entre les deux prises de vue (cas 1 : mouvement panoramique de la caméra par rotation autour du centre optique). On peut montrer que ce cas de figure ne permet pas de déterminer le relief de la scène. En revanche, son intérêt essentiel est la possibilité de réaliser des "mosaïques d'images". Vous allez réaliser une telle mosaïque, à partir des deux images stéréoscopiques suivantes :

        image gauche          image droite

    image gauche                                                                      image droite

    A partir de ces deux images, de taille 312 x 416, le but est de produire une image de taille 385 x 741, dans laquelle l'image gauche sera étendue, sur sa droite, par des pixels provenant de la projection perspective de pixels de l'image droite sur la rétine gauche.

    Le travail va se dérouler en deux étapes :

    2. Détermination de la matrice H.

    Il a été vu en cours (chapitre 4) que la relation entre le triplet des coordonnées homogènes mIg d'un pixel de l'image gauche et les coordonnées (uIg,vIg) du pixel de l'image droite qui correspond au même point physique, dans le cas où le centre optique de la caméra est fixe (cas 1), s'écrit :

    expressions dans lesquelles les numérateurs et les dénominateurs des membres droits sont des produits matriciels, c'est-à-dire que l'on peut réécrire ces relations sous la forme suivante :

    La détermination de la matrice H revient donc à la détermination des 9 coefficients H11, H12, H13, H21, H22, H23, H31, H32 et H33. Or on a vu en cours que l'un de ces coefficients pouvait être pris arbitrairement égal à 1 (sauf si ce coefficient est nul). Nous choisissons de fixer le coefficient H33 à 1. Il reste à déterminer les 8 autres coefficients. Or, en réécrivant (3) et (4), on voit que la connaissance d'une paire de pixels Ig = (uIg,vIg) et Id = (uId,vId) donne les deux équations linéaires suivantes entre les 8 coefficients inconnus :

    Si on dispose de 4 paires de pixels, on voit que la détermination des 8 coefficients cherchés revient à la résolution d'un système de 8 équations linéaires à 8 inconnues. Ce système peut être écrit sous la forme matricielle suivante :

    où B est un vecteur dont les 8 coordonnées sont les seconds membres d'équations du type (5) ou (6), X est un vecteur dont les 8 coordonnées sont les 8 inconnues H11, H12, H13, H21, H22, H23, H31 et H32, et M est une matrice 8 x 8 dont les éléments sont les coefficients de ces inconnues dans des équations du type (5) ou(6).

    1- A l'aide de Khoros, visualisez les images contenues dans les fichiers de noms points_ref_gauche.ras et points_ref_droite.ras (format "Sun"), situées dans le répertoire ../TESTS. Ces images n'étant pas au format "brut" mais au format "Sun", il faut, pour les visualiser, utiliser la chaîne constituée des deux "glyphs" suivants :

    Sur chaque image apparaissent 4 croix de 4 couleurs différentes. Les centres de ces croix, dont le niveau de gris a été mis à la valeur 1, désignent des pixels formant des paires. A l'aide de la souris, repérez les coordonnées image de ces différents pixels. Si vous éprouvez des difficultés à viser la position précise des centres des croix de couleurs, vous pouvez utiliser le zoom du "glyph" que vous aviez déjà utilisé lors de la première séance de travaux pratiques, de chemin d'accès :

    Attention :

    2- Écrivez un programme C qui réalise les tâches suivantes :

    3- Écrivez la fonction C d'en-tête :

    qui réalise les tâches suivantes :

    Avant de passer à la suite du TP, veuillez faire vérifier par l'enseignant les valeurs que vous avez trouvées pour les 9 coefficients de la matrice H.

    3. Réalisation de la mosaïque.

    Vous allez maintenant réaliser la mosaïque, en procédant de la manière suivante :

    3.1. Initialisation de l'image résultat.

    Vous allez modifier pas à pas le programme C du paragraphe précédent.

    1- La paire d'images stéréoscopiques de départ est constituée d'images de taille 312 x 416, stockées dans les fichiers image_gauche.brt et image_droite.brt, de format "brut" (c'est-à-dire composés de valeurs de type unsigned char, sans en-tête), et situés dans le répertoire ../TESTS

    Définissez les constantes LIGNES=312 et COLONNES=416

    Déclarez les tableaux unsigned char E_gauche[LIGNES][COLONNES] et unsigned char E_droite[LIGNES][COLONNES].

    Écrivez la fonction d'en-tête :

    qui affecte au tableau E les valeurs contenues dans le fichier de nom nom_fichier.

    2- L'image résultat sera de taille 385 x 741 et sera stockée dans le fichier "brut" de nom image_resultat.brt.

    Définissez les constantes LIGNES_RES=385 et COLONNES_RES=741

    Déclarez le tableau unsigned char E_resultat[LIGNES_RES][COLONNES_RES].

    Écrivez la fonction d'en-tête :

    qui écrit le fichier de nom nom_fichier avec les valeurs du tableau E.

    3- Dans l'image résultat, les pixels de l'image gauche subissent un décalage, de sorte que le niveau de gris E_gauche[0][0] sera recopié dans la case E_resultat[21][0].

    Définissez la constante DECA_LIGNES=21

    Écrivez la fonction d'en-tête :

    qui initialise le tableau E_resultat aux valeurs du tableau E_gauche pour les pixels correspondant à l'image gauche, avec le décalage décrit ci-dessus, et à la valeur 0 pour tous les autres pixels.

    4- Modifiez le programme principal, de manière à :

    Visualisez ce fichier à l'aide de Khoros, et faites valider l'image obtenue par l'enseignant, avant de passer à la suite du TP.

    3.2. Rajout de la partie non visible sur l'image gauche.

    1- Écrivez la fonction d'en-tête :

    qui calcule, pour un pixel de l'image gauche, de coordonnées image gauche(ug,vg), les coordonnées image droite(ud,vd) du pixel de l'image droite qui correspond au même point physique, grâce aux formules (3) et (4) citées plus haut. Les coordonnées ud et vd sont nécessairement flottantes, puisque le tableau H est composé de valeurs flottantes et que (3) et (4) font apparaître des fractions.

    Testez cette fonction pour les 4 pixels de l'image gauche situés aux centres des 4 croix de couleurs, qui vous ont servi pour le calcul de la matrice H. Vérifiez que les valeurs de ud et vd retournées correspondent aux 4 pixels de l'image droite situés aux centres des croix de couleurs.

    2- Écrivez la fonction d'en-tête :

    qui rajoute sur l'image résultat les pixels correspondant à des points non visibles sur l'image gauche, mais visibles sur l'image droite, selon l'algorithme suivant :

    3- Modifiez le programme principal, de manière à rajouter ces pixels. Visualisez la nouvelle image résultat. Quel est selon vous le principal défaut de cette "mosaïque" ? Comment pourrait-on y remédier ?


    Ces pages ont été réalisées par Jean-Denis Durou, Laurent Mascarilla et Pascal Matsakis.
    Pour tout commentaire, envoyer un mail à durou@irit.fr.