STEREOVISION 3D
par corrélation
Projet Réalisé par Frédéric DIDIER (promo
97)
Description du projet
Le but du programme est de reconstruire un objet 3D à partir de
2 images prises sous 2 angles différents. Autrement dit, il faut
retrouver la notion de profondeur. On calibre au préalable la caméra
avec une mire parfaitement connue. Le cheminement du projet respecte l'ordre
suivant :
-
calibrage de la caméra avec la mire
-
rectification des images de l'objet 3D
-
corrélation et calcul des cartes de disparité
-
construction d'un fichier de points 3D lisible par geomview.
Algorithmes utilisés
La calibration se fait à partir des programmes
proposés par Régis Vaillant. Avec cal_camera, on obtient
les matrices de projection perspective des deux images.
La rectification permet de parcourir des épipolaires
horizontales lors du calcul des coefficients de corrélation. Les
matrices permettent d'obtenir les coordonnées des centres optiques
des deux images, puis on calcule l'équation du plan de rectification
qui doit être parallèle à l'axe formé par ces
deux centres optiques et parallèle à la droite d'intersection
des plans contenant les deux images. On projette ensuite les quatre coins
des deux images sur ce plan et on détermine la position et le cadrage
des images rectifiées. C'est le fichier rectif.c qui dirige l'orchestration.
Pour chaque pixel d'une image, on calcule la corrélation
d'un voisinage de ce pixel avec tous les pixels de l'horizontale correspondante.
On retient alors la disparité pour laquelle la corrélation
est maximale. On effectue le calcul dans l'autre sens ce qui limite le
nombre d'erreurs. Le critère de corrélation est un critère
de variance. Autrement dit, il prend en compte la variation d'intensité
des pixels et non l'intensité elle-même. Les fichiers fonct.c
et correl.c s'occupent de la bonne mise en oeuvre du travail.
Avec la correspondance des pixels d'une image à
l'autre, on peut reconstruire les coordonnées 3D en calculant l'intersection
des droites passant par les pixels associés et par les centres optiques.
Il suffit alors d'une triangulation pour visionner dans geomview.
Résultats obtenus
L'appariement par une méthode de corrélation
ne marche bien bien que sur des objets suffisamment diffusants puisque
l'on compare des luminosités et des variances. Un visage, un animal
ou un objet en bois font l'affaire.
L’utilisation d’une grande fenêtre de corrélation
minimise l’erreur d’appariement, mais l’algorithme risque alors de perdre
les détails de la scène et la présence de motifs pseudo-répétitifs
dans la scène engendrera un groupe de pics de corrélation
dont on ne pourra savoir lequel correspond à l’appariement recherché.
On peut utiliser la forme de la courbe de corrélation pour donner
une mesure de confiance à l’appariement : lorsque celui-ci n’est
pas un maximum isolé de corrélation, la confiance accordée
à un tel appariement sera alors faible.
Le problème qui se pose à moi actuellement,
est une boucle infinie que je n’ai pas encore repérée. De
ce fait, je n'ai pas de résultat à présenter.
Problèmes rencontrés et solutions apportées
Le calcul de corrélation prend énormément
de temps car les formules sont de formes quadratiques. Il pourrait être
intéressant, au niveau du temps de calcul, d'utiliser un autre critère
qui soit linéaire, comme par exemple celui d'intensité moyenne
et comparer les rapports qualité/temps de calcul.
Il est quasiment impossible que lors du calcul de
la reconstruction 3D, les deux droites issues des pixels en correspondance
se croisent réellement. Il peut s'avérer nécessaire
de faire une interpolation.
Il faut fournir au programme des images de mires
prises par la camera, de manière à ce qu'il soit possible
de calibrer les cameras. A partir de là, il est possible de rectifier
les images, dans le seul but de simplifier l'écriture du programme.
Je ne me suis pas occupé de la partie calibration préférant
m'assurer des parties corrélation et rectification avant. De ce
fait, j'ai été un peu gêné car je considérais
comme données les matrices alors que je ne sais pas les obtenir.
Il faut donc que je me serve des programmes de Régis Vaillant.
Lorsque l’on a des images rectifiées, toutes
les zones n’ont pas besoin d’être appariées. Une image rectifiée
prend la forme trapézoïdale laissant des zones noires. Il y
a donc peu d’intérêt à chercher une correspondance
avec la deuxième image. Au départ, j’avais prévu de
parcourir toute la ligne en partant du début et la fin et de tester
à chaque fois si j’étais arrivé dans l’image ce qui
m’aurait permis d’éviter de faire des calculs inutiles. Mais, quand
je me suis occupé de la rectification en elle-même et que
je cherchais à déterminer les équations des droites
qui délimitaient les bords de l’image rectifiée, j’ai pensé
que je pourrais m’en servir. Je n’ai pas eu le temps de m’en charger, mais
c’est de toute évidence une amélioration à envisager
parmi les premières.
De même, si on cherche à reconstituer un objet ou
un visage, on peut chercher à ne pas prendre en compte les détails
autour. C’est un cas plus délicat car les intensités à
l’intérieur de l’image sont hétérogènes.
Un problème qui s’est présenté
à moi concernait la superposition de la fenêtre d’exploration
avec l’image. Il n’est pas possible de jouer sur les intensités
de pixel si la fenêtre déborde. Il a donc fallu que je considère
un cadre à l’intérieur de l’image d’épaisseur la taille
de fenêtre. On ne perd pas énormément d’informations
si l’objet est situé dans une zone un peu plus centrale. Cela rejoint
le problème précédent qui consistait à ne rechercher
que la texture de l’objet avant de commencer la corrélation.
Retour à la liste des projets réalisés