espace

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



Séance 1 :

  • 1. Introduction : structures de données.
  • 2. Phase 1 : calibrage.
  • 3. Phase 2 : appariement.

  • 1. Introduction : structures de données.

    Le but de ce TP de Vision par Ordinateur est de mettre en oeuvre la programmation, en langage C, de l'algorithme simplifié de vision du relief par stéréovision étudié en cours (chapitre 3 du cours de vision par ordinateur). Il vous est conseillé de créer un sous-répertoire vision.

    Commencez par visualiser, à l'aide de Khoros, la paire d'images stéréoscopiques de synthèse (de taille 128x128) sur laquelle vous testerez votre programme, située dans le répertoire ../TESTS, dans les fichiers image_gauche_1.brt et image_droite_1.brt. Si vous éprouvez des difficultés pour réaliser l'affichage d'une image au format .brt sous Khoros, cliquez sur le canot de sauvetage ci-dessous :

    Vous constatez que vous êtes fortement gêné pour interpréter le relief de cette scène !

    La suite de ce paragraphe d'introduction décrit les structures de données que vous utiliserez dans ce TP.

    Vous définirez la constante N=128, et vous stockerez les deux images dans les deux tableaux unsigned char Eg[N][N] et unsigned char Ed[N][N].

    Vous déclarerez également les trois autres tableaux suivants :

    Cette liste de variables n'est bien sûr pas limitative.

    2. Phase 1 : calibrage.

    Avant de passer à la partie programmation de ce TP, il faut réaliser la phase préliminaire de calibrage.

    2.1. Rappels de cours.

    Dans le cadre simplifié dans lequel nous nous sommes placés pour ce TP (voir le chapitre 3 du cours de vision par ordinateur), cette phase est grandement simplifiée, et se réduit à la détermination de deux paramètres :

    Lorsque les valeurs de ces deux paramètres auront été déterminées, vous pourrez les affecter à deux constantes de votre programme.

    2.2. Détermination des paramètres de calibrage.

    Les deux images que vous avez visualisées plus haut étant des images de synthèse, le facteur d'échellen'a pas de signification physique, et pour cette raison on le choisira conventionnellement égal à 1 (il est donc inutile de définir une constante correspondant à ce paramètre).

    En revanche, la détermination de l'angledoit être faite suivant la méthode vue en cours. Selon cette méthode, la connaissance d'une paire de pixels, ainsi que des coordonnées (XP,ZP) du point physique P correspondant à cette paire, est nécessaire. Elle est suffisante si XP et ZP sont non nuls.

    Les niveaux de gris des deux images contenues dans les fichiers image_gauche_1.brt et image_droite_1.brt ont en fait des valeurs entières comprises entre 0 et 100, sauf pour deux points particuliers :

    1- A l'aide de la souris, localisez les deux pixels correspondant au point P1. Vous remarquez que trois entiers s'affichent simultanément, concernant le pixel pointé par la souris : les numéros de ligne et de colonne, ainsi que le niveau de gris. Notez les valeurs de igP1, jgP1, idP1 et jdP1. Vérifiez au passage que vous trouvez bien igP1= idP1 (contrainte épipolaire). Si vous éprouvez des difficultés à discerner les pixels correspondant à P1 et P2, vous pouvez utiliser un autre "glyph" de Khoros :

    et le brancher sur le "glyph" Import Raw de la chaîne précédente. Lorsqu'on lance l'exécution de ce nouveau "glyph", après chargement, une fenêtre permet d'afficher l'image avec un facteur de zoom égal à 8 par défaut (pour cela, cliquez sur Zoom).

    2- En considérant quevaut 1, les relations entre numéros de ligne et de colonne et coordonnées dans un repère image (gauche ou droit) sont résumées par le schéma suivant :


    L'origine O du repère image correspond à i = j = 63.

    Calculez xgP1 et xdP1.

    3- A l'aide de la formule vue en cours, déterminez l'angle  (en degrés). Pour ces quelques calculs, il est inutile d'écrire un programme. Il vous suffit d'utiliser votre machine à calculer ou, si vous n'en possédez pas, de lancer la commande xcalc&

    4- Répétez la même séquence d'opérations pour le point P2.

    5- Définissez dans votre programme la constante alpha, égale à la moyenne des deux valeurs trouvées précédemment convertie en radians (avec trois chiffres significatifs).

    3. Phase 2 : appariement.

    Vous allez réaliser l'appariement entre les deux images précédentes par la méthode de corrélation vue en cours, en utilisant une fenêtre de corrélation carrée, centrée sur le pixel à apparier, de taille (2T+1)x(2T+1). Définissez pour le moment la constante T=1, qui correspond à une fenêtre de taille 3x3. Vous changerez ultérieurement la valeur de cette constante.

    3.1. Lecture d'une image au format .brt

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

    qui permet d'affecter les valeurs (de type unsigned char) du fichier nom_fichier (sans en-tête, c'est-à-dire au format "brut" .brt) au tableau tab.

    Attention :

    Si vous éprouvez des difficultés avec les différentes fonctions de lecture/écriture dans des fichiers, cliquez sur le canot de sauvetage ci-dessous :

    3.2. Appariement des pixels de l'image gauche et de l'image droite.

    1- On souhaite d'abord apparier les pixels de l'image gauche non situés au bord. Pour cela, commencez par initialiser toutes les cases du tableau short Cg[N][N] à la valeur -1. Une case Cg[i][j] de ce tableau qui conservera la valeur -1 correspondra à un pixel de l'image gauche Igi,j qui n'a pas pu être apparié.

    2- Ensuite, on voudra réaliser la même opération pour les pixels de l'image droite non situés au bord. Initialisez donc également toutes les cases du tableau short Cd[N][N] à la valeur -1.

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

    qui permet d'apparier, au choix, les pixels de l'image gauche ou de l'image droite, suivant l'algorithme qui a déjà été décrit en cours :

    3.3. Contrainte d'unicité.

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

    qui permet d'appliquer la contrainte d'unicité, et ce de la manière suivante :

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

    qui retourne le pourcentage de paires obtenues après application de la contrainte d'unicité, c'est-à-dire le nombre de paires réalisées divisé par le nombre de pixels de chaque image.

    3.4. Programme principal et tests de validation.

    1- Écrivez le programme principal réalisant les tâches suivantes :

    2- Tests de validation :

    Avant de passer à la suite de ce TP, vérifiez que vous obtenez bien l'affichage suivant lorsque T=1 :

    ainsi que l'affichage suivant, lorsque T=2 :

    3.5. Contrainte de seuil et tests de validation.

    On souhaite appliquer aux paires réalisées précédemment (et vérifiant déjà les contraintes épipolaire et d'unicité) la contrainte de seuil étudiée en cours. Pour cela, définissez la constante S=0.05.

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

    qui retourne 1 si la paire constituée des pixels Igi,j et Idi,l vérifie la contrainte de seuil, et 0 sinon.

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

    qui appelle la fonction précédente, et qui procède comme suit :

    3- Tests de validation :

    Dans le programme principal, appliquez la contrainte de seuil, et vérifiez que vous obtenez bien l'affichage suivant lorsque S=0.05 et T=1 :

    et, lorsque S=0.01 et T=1 :

    Une fois ces tests validés, vous garderez pour les constantes T et S les dernières valeurs testées. Vous pouvez maintenant passer à la deuxième séance de TP.


    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.