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 :

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