IFT6145 - Vision 3D


Travail Pratique 3 : Stéréoscopie


Début

25 mars 2008

Remise

~3 semaines

Partie 1 - Fonction de coût

Vous devez créer un programme en C qui fait les fonctions suivantes:
Lire un fichier de description de scene
Un fichier .cameras contient la definition des cameras et le choix des images. Voici deux exemples: scene.cameras et standard.cameras
Lire (et executer) un fichier de description de commandes
Un fichier .commandes contient des commandes a executer. Voici un exemple: test.commandes
Vous devez absolument:

Projection

Commande proj[z|d] (ref_cam) (x) (y) (z|d)
projz 0 100.0 100.0 10.0
projd 0 100.0 100.0 0.1
Prend un point (x,y) en pixel dans la camera (ref_cam) et lui donne la profondeur z (ou la disparite d), puis le reprojete dans toutes les cameras.
proj[0,100.0,100.0,10.0z]=
   cam0:[100.0,100.0]
   cam1:[24.5,293.3]
Utilisez [] pour les projection a l'exterieur de l'image. Attention: Verifiez que le point se projet EN AVANT des cameras.

Couleur

Commande couleur[z|d] (type) (ref_cam) (x) (y) (z|d)
couleurz plusproche 0 100.0 100.0 10.0
couleurz interpole 0 100.0 100.0 10.0
couleurz minmax 0 100.0 100.0 10.0
Prend un point comme pour la commande proj mais affiche la couleur en ce point. On doit afficher la couleur selon le type. Notez que les couleurs R,G,B sont traites independamment.
couleur[0,100.0,100.0,10.0z]=
    cam0:[30,45,66]
    ...
    cam2:[30,25,206]
ou (pour le type minmax)
    cam0:[30-35,45-67,66-66]
Soit p la position "float" d'un pixel dans l'image. La couleur plusproche est la couleur du pixel entier le plus proche de p. La couleur interpole est la couleur interpolée bi-linéairement (voir Interpole dans img.c). La couleur minmax est la couleur du pixel le plus proche de p dans l'image min, et dans l'image max. L'image min est définie comme suit: I_min(x,y)=min(I(x +/- 1,y +/- 1) et même chose pour max. La couleur minmax est donc un intervalle de valeurs.

Cout

Commande cout[z|d] (type de cout) (type de couleur) (ref_cam) (x) (y) (z|d)
coutz variance plusproche 0 100.0 100.0 10.0
coutz reference plusproche 0 100.0 100.0 10.0
coutd absolu minmax 0 100.0 100.0 0.1
devrait afficher (pour 1 commande):
cout[0,100.0,100.0,10.0z]=123.5
Notez que le cout est calculé pour chaque couleur (R,G,B) séparement et additionné pour donner le coût final. Le type de coût peut être la variance, la reference et absolu.
variance: somme des differences au carré avec la moyenne.
reference: somme des différences au carré avec la couleur de la caméra de référence.
absolu: somme des differences absolues avec la moyenne.

Scan

Cette fonction calcule le coût sur un intervalle de profondeur donné.

Commande: scan[z|d] (type de cout) (type de couleur) (ref_cam) (x) (y) (z1|d1) (z2|d2) (nb_valeurs)

scanz variance plusproche 0 100.0 100.0 10.0 20.0 11
scand variance interpole 0 100.0 100.0 0.1 0.05 3
devrait afficher
 scan[0,100.0,100.0,(0.1:0.05)z]:
   0.1z : 123.7848
   ...
   0.05z : 150.8
Notez que pour générer nb valeurs entre z1 et z2, on utilise
for(i=0;i<nb;i++) z=(z2-z1)*i/(nb-1)+z1;

Stereo

Cette fonction calcule finalement ce qu'on voulait au départ, une carte de profondeur. Commande: stereo[z|d] (algo) (type_de_cout) (type_de_couleur) (ref_cam) (z1|d1) (z2|d2) (nb_valeurs) (nom_de_sortie) Exemple de commandes:
stereoz recherchedirecte variance plusproche 2 -15 0 16 sortieA
stereod recherchedirecte variance interpole 2 -15 0 16 sortieB

stereoz progdynamique reference minmax 2 -15 0 16 sortieA
stereod progdynamique absolu minmax 2 -15 0 16 sortieB
Les algorithmes sont:
recherchedirecte : fait une recherche directe.
progdynamique : utilise la programmation dynamique, sur les lignes horizontales seulement.

La sortie est une carte de profondeur sauvegardée dans un fichier comme suit: (sortie)_(algo)_(cout)_(couleur)_disp.pgm
et si on a nb de valeurs de profondeurs, alors on doit normaliser entre 0 et 255 comme suit: v = d / (nb-1) * 255.

On doit aussi générer une sortie d'une image interpolée pour la caméra de référence, avec le nom: (sortie)_(algo)_(cout)_(couleur)_inter.pgm qui contient la valeur de la couleur "interpole" moyenne pour chaque pixel avec sa profondeur finale.

Utilisez les abréviations suivantes pour le nom de fichier:
algo cout couleur
recherchedirecterd variancevar plusprochevar
progdynamiquedp referenceref interpolei
absoluabs minmaxmm
Donc le résulats de la commande

stereod recherchedirecte variance interpole 2 -15 0 16 blub
Devrait être dans les fichiers
blub_rd_var_i_disp.pgm
blub_rd_var_i_inter.pgm

Evaluation

Partie 2 - Mise en correspondance

Regardez l'exemple 1 (tsukuba) et implantez la commande stereod telle que decrite.

Présentation des résultats

Je donnerai bientot des exemples de fichier .cameras et .commandes a executer.

Librarie C et exemple complet

Librarie pour lire, sauvegarder, interpoler, etc... des images. Librarie pour les matrices, etc... des images.

Exemple 1 - Tsukuba

Les fichiers: tsukuba.commandes, tsukuba.cameras
Les images: tsukuba  

 

 

 

 

 

 

 

Exemple 2 - Parcometre

Les fichiers: pm.commandes, pm.cameras
Les images: pm

Exemples supplementaires

Il y aura quelques autres exemple a resoudre.