TD7 : Stéréoscopie par corrélation
Le but du TD est de realiser un programme de stereoscopie par
correlation prenant en entree deux images rectifiees, et donnant
comme resultat une carte de disparite
- Recuperez le squelette du TD, et un exemple de paire stereo rectifiée : gauche, droite. Il
doit compiler mais n'est pas fonctionnel. Exemple d'utilisation:
./stereo left_r.pgm right_r.pgm -56 -30 11
Les sorties (carte de disparite et score) se trouvent dans disp.pgm et score.pgm
- Remarquez les deux #define en tete du fichier principal
stereo.c. ZERO_MEAN permet d'utiliser le critere ZSSD au lieu de
SSD. COURBE_SCORE permet de sortir la courbe des scores en un point
de l'image 1 plutot que la carte de disparite. Regardez ce que
declenchent ces #defines dans le code.
- Ecrivez la partie manquante de la fonction scorePoint de
correlation.c. Pour la tester, compilez en definissant COURBE_SCORE
pour avoir la courbe des scores au point (211,159), et tracez la
courbe obtenue (cf notes plus bas pour l'utilisation de
gnuplot ou de graph).
- Tracez la courbe avec et sans ZERO_MEAN, que
remarquez-vous?
- Identifiez le correspondant du point (211,159)
- Tracez la courbe de score du point correspondant: il faut
echanger les deux images, changer les coordonnees du point dans le
source, et recalculer l'intervalle de disparite. Que remarquez-vous
?
- Ecrivez les parties manquantes des fonctions correlationPoint
(recherche du meilleur correspondant) et correlationImages. correlationPoint renverra dispmax lorsque le meilleur score est obtenu en une des bornes de l'intervalle (expliquez pourquoi).
Recompilez en enlevant le #define COURBE_SCORE
- Calculez la carte de disparite sur herve, avec et sans
ZERO_MEAN, qu'observez-vous ?
- La validation aller-retour consiste a calculer une carte de disparite gauche-droite puis droite-gauche, puis a verifier la coherences de ces deux cartes de disparites
- Quels sont les arguments a passer au programme pour xalculer la carte de disparite retour ? Visualisez-la.
- Integrez la stereo aller-retour : calcul de la carte retour, puis validation (fonction validationAllerRetour de correlation.c)
- Comparez les cartes de disparite obtenues par stereo aller simple et aller-retour.
- Que proposez-vous pour amelierer ce resultat ?
- Modifiez la fonction correlationPoint pour avoir une approximation a une precision sous-pixelique de la disparite.
- Question subsidiaire (difficile) : Optimisez l'algorithme pour utiliser la methode de la fenetre glissante.
Notes
- Cette version n'utilise pas l'algorithme de fenetre glissante
vu en cours. Par contre la fonction calculMoyenne de moyenne.c
utilise une fenetre glissante, allez y jeter un coup d'oeil.
- Si on stocke la courbe des scores en ascii dans le fichier
"score.plot", avec sur chaque ligne la disparite et le score, on
peut tracer la courbe en utilisant la commande suivante apres avoir
lance "gnuplot" :
plot 'score.plot' with lines
Ou bien avec la commande "graph" (disponible au moins sur la machine
mandelbrot) :
graph -T X score.plot
- Suppression des multiplications par dimx : Les multiplications d'entiers prennent parfois plus de temps que les multiplications de flottants, il faut donc les eviter au maximum. C'est une astuce classique quand on ecrit une boucle sur une image du type:
for(i=..; i<..; i++) {
for(j=..; j<..; j++) {
.. image[(y+j)*dimx + (x+i)] ..
}
}
En developpant l'indice entre crochets, on remarque un terme constant, xy=y*dimx+x, et deux termes variables, i et j*dimx. Pour eviter toute multiplication par dimx, il suffit d'utiliser comme variable pour le second for() jdimx=j*dimx, qui est incrementee de dimx a chaque iteration:
for(jdimx=..*dimx; jdimx<..; jdimx+=dimx) {
Attention a bien verifier les bornes des boucles apres optimisation !
Pour rendre le TD
Envoyez par mail le fichier stereo.tar.gz obtenu par la commande
"make tar" sous forme d'attachement à l'adresse habituelle
en précisant :
- Le binome qui a réalisé le TD
- Les réponses à chaque question du TD
- Un exemple d'execution (commande complète à utiliser sur les
images d'hervé)
Frederic Devernay
Last modified: Fri Feb 6 18:01:15 CET 2004