IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Reconstruction 3D et stéréovision


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut Reconstruction 3D et stéréovision
    Salut,
    Je sais que ce sujet revient souvent mais ... comme beaucoup de monde j'aimerai l'aide des connaisseurs dans ce domaine...
    Alors voila, je cherche a reconstruire un model 3D (une partie d'un visage ) a partir d'un appareillage stereo. J'ai tout ce qu'il faut pour obtenir le calibrage de chacune de mes cameras et du system stereo en soit meme.

    A savoir j'ai donc : matrix intrinsic et extrinsic de chacune de mes cameras et les matrices essentiel et fondamental.

    Il me reste maintenant a creer mon model 3D a partir de 2 images (vue gauche et vu droite ) du visage en question. Voici la procedure que je pense correct :

    1/ Recuperation de mes deux images vue de gauche et vue de droite
    2/ Distortion de mes images afin d obtenir les deux images sur le meme plan et afin davoir des lignes epipolaires paralleles (avec un cvRemap je pense, par contre je ne sias pas quel parametre utiliser )

    ( Peut etre utilise cvFindStereoCorrespondenceBM, mais je sais pas comment utilise la carte de disparite genere)
    3/ Pour chaque pixel de limage de gauche
    Chercher la correspondance de celui ci sur limage de droite
    Proceder au calculer de la position 3D de celuici
    Stockage de cette position

    Avant de continuer sur d'autre question pensez vous que je suis dans le juste ? Comment trouver la position 3D une fois que j'ai la correspondance dans les deux images. Comment utiliser la carte de disparite si je la genere ?


    Merci

  2. #2
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    Bon, apres plusieurs recherches j'apporte donc moi meme les reponses lol.
    La reconstruction se fait donc en 4 etapes

    //Initialisation et Mise en place des donnees

    1/ Calibration des cameras par cvStereoCalibrate ....
    2/ Creation des matrix de distortion de mes images afin d'avoir mes lignes epipolaire parallele :par cvStereoRectifyUncalibrated puis cvRemap

    //Creation de la carte de disparite
    3/cvFindStereoCorrespondenceBM et cvNormalize

    //Creation des points 3D
    4/Boucle sur tous les pixels de la carte de disparite avec pour chaque vertex cree :
    baseLine: la distance entre les 2 cameras
    focus : le focus apres rectification
    disparity : la valeur du pixel courant

    z = (baseLine*focus / disparity);
    x =(right.x * z)/focus ;
    y =(right.y * z)/focus;



    Cependant les resultats ne sont pas probant l'algorithme d'openCV pour la correspondance (SAD) entre les 2 images rectifiees est un peu basic. On peut l'utiliser d'ailleur des images deja rectifie pour le tester. Vous trouverez sur ce site des images tests : http://vision.middlebury.edu/stereo/data/

    Voila donc pour ma part, je continue mon projet en travaillant sur l'etape 3 (correspondance) en utilisant d'autre fonction de cout pour le calcul de la disparite et d'autre optimisateur. J'ai vu des choses sur les fonctions d'energies et l'algorithme graph cut (coupure de graph) mais c'est un peu flou encore si vous avez des suggestions ......... J'espere faire reveiller cette discution je pense que le sujet est interessant.

  3. #3
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    Je viens au news meme si cela a l'air d'interesser personne au pire ca fait un mini tutoriel pour les prochains a ce lancer dans le sujet.
    Alors apres avoir programme bon nombre d'algorithme pour la correspondance entre 2 images rectifiees (ligne epipolaire parallele), j'ai trouve un algorithme deja programme par google qui fait (en tout cas pour un premier temps) une carte de disparite de bonne qualite. Le projet s'appel OpenVis 3D et s'integre tres facilement a votre code. De toute beaute ....

    http://code.google.com/p/openvis3d/


    Merci Google ...

    Ciao Boy

  4. #4
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    Je reprend mon petit sujet qui interresse un petit peu j'espere sans apporter neanmoins de dialogue (c'est dommage d'ailleur).

    J'ai fait de nombreux test avec l'algo de google qui donne des resultats pas trop mal mais je voulais encore mieu. J'ai donc exploite deux code :

    http://vision.middlebury.edu/MRF/code/
    http://vision.middlebury.edu/stereo/code/

    Je ne travail pas sous linux (malheureusement) donc j'ai utilise l'emulateur cygwin afin d'evaluer les resultats avec mon jeu d'image.

    http://cygwin.com/setup.exe (attention a rajouter les package gcc et make dans devel ....)

    Les resultats ne sont pas mauvais pas forcement beaucoup mieu qu'avec OpenVis (google algo) cependant il reste interressant a exploiter ....

    Sur ceux ..... hesitez pas a reagir ....

  5. #5
    Nouveau candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Par défaut
    Citation Envoyé par xtra.creativity Voir le message
    Salut,
    Je sais que ce sujet revient souvent mais ... comme beaucoup de monde j'aimerai l'aide des connaisseurs dans ce domaine...
    Alors voila, je cherche a reconstruire un model 3D (une partie d'un visage ) a partir d'un appareillage stereo. J'ai tout ce qu'il faut pour obtenir le calibrage de chacune de mes cameras et du system stereo en soit meme.

    A savoir j'ai donc : matrix intrinsic et extrinsic de chacune de mes cameras et les matrices essentiel et fondamental.

    Il me reste maintenant a creer mon model 3D a partir de 2 images (vue gauche et vu droite ) du visage en question. Voici la procedure que je pense correct :

    1/ Recuperation de mes deux images vue de gauche et vue de droite
    2/ Distortion de mes images afin d obtenir les deux images sur le meme plan et afin davoir des lignes epipolaires paralleles (avec un cvRemap je pense, par contre je ne sias pas quel parametre utiliser )

    ( Peut etre utilise cvFindStereoCorrespondenceBM, mais je sais pas comment utilise la carte de disparite genere)
    3/ Pour chaque pixel de limage de gauche
    Chercher la correspondance de celui ci sur limage de droite
    Proceder au calculer de la position 3D de celuici
    Stockage de cette position

    Avant de continuer sur d'autre question pensez vous que je suis dans le juste ? Comment trouver la position 3D une fois que j'ai la correspondance dans les deux images. Comment utiliser la carte de disparite si je la genere ?


    Merci
    boujour, ne vous inquietez pas votre topic et tres palpitant, et il m'aide beaucoup en ce moment, je suis debutant en c++ car d'habitude je programme en matlab, et l'on m'a demander de faire de la sterovision en c++.
    bref merci pour votre aide.
    cordialement

  6. #6
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    Petit info :

    Pour la reconstruction 3D, j'utilise la meme reconstruction qu'avec l'utilisation d'un height map pour la reconstruction d'un terrain par exemple. A savoir je plaque la texture de l'image de gauche ou de droite source (depend de la construction de la disparity map) et part la suite j'eleve mes vertex. Cependant, il est assez etrange d'utiliser directement la diparity map directement comme une height map et non apres triangulation comme ceci :

    z = (baseLine*focus / disparity);
    x =(right.x * z)/focus ;
    y =(right.y * z)/focus;

    Mais les resulats avec triangulation sont weird (etrange ... lol j'aime bien ce mot). Quand pensez vous ?

    Il peut etre aussi interessant d'utiliser delaunay ou les marching cubes pour la reconstruction mais avec 2 vues une simple elevation est amplement suffisante.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut Disparity _ map
    Bonjour ,

    j'ai effectué une calibration stereo avec openCV et j'arrive à aligner mes deux images (j'ai deux caméras), jusque la tout va bien, sauf que je n'arrive pas à retrouver la correspondance entre mes points de l'image gauche et ceux de l'image droite.

    J'obtiens la carte de disparité à l'aide de la fonction cvFindStereoCorrespondenceBM mais je n'arrive pas à me servir correctement de ma carte de disparité !!

    est-ce-qu'il faut que j'additionne mes disparités aux coordonées de mon image droite pour avoir ceux de gauche ?? ou bien l'inverse ?

    Mon but final est d'obtenir les coordonnées 3D !!

    merci pour votre aide qui me serai bien precieuse ..........

  8. #8
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    est-ce-qu'il faut que j'additionne mes disparités aux coordonées de mon image droite pour avoir ceux de gauche ?? ou bien l'inverse ?
    Je comprend pas cette question ... mais je vais quand meme te repondre lol
    Dans openCV la carte de disparite est inversement proportionnelle a la distance au points. Genre la plus grande valeur est la plus petite distance .... (j'ai vu ca qu'avec opencv ...). Comme je l'explique plus haut tu peu te servir de ta carte de disparite comme d'une height map (avec une sorte de coef multiplicateur pour donner plus ou moins de relief a ta surface) mais comme tu dois le comprendre c'est plutot moche ....

    Je l'utilise "temporairement" comme cela :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //Creation des points 3D
    Boucle sur tous les pixels de la carte de disparite 
     
    z =pixel.valuedisparity;
    x =pixel.x ;
    y =pixel.y;
    creer vertex (x,y,z);
    Alors que dans la theorie on devrai faire une triangulation :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Boucle sur tous les pixels de la carte de disparite 
     
    baseLine: la distance entre les 2 cameras
    focus : le focus apres rectification
    valuedisparity: la valeur du pixel courant
     
    z = (baseLine*focus / pixel.valuedisparity);
    x =(pixel.x * z)/focus ;
    y =(pixel.y * z)/focus;
     
    creer vertex (x,y,z);


    Mais la vrai difficulte est d'avoir une bonne carte de disparite .... le probleme de reconstruction surtout si tu n'a que deux cameras est vraiment minime....


    J'espere t'avoir aide

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut Encore bloqué !!
    SAlut,

    merci pour ta réponse ....!! par contre je pense que je me suis mal expliqué !!
    je vais essayé de reposer la question autrement.

    Par exemple je prends en photo un crayon avec les deux cameras,
    Mon but est de trouver les coordonnées des points de l'image gauche sur l'image droite: exemple: je sais que le bout du crayon sur limage gauche a la coordonnée suivante : 10, 127. comment faire à partir de cette coordonnée de trouver les coordonnées du bout du crayon sur l'image de droite.

    J'utilise les fonctions d'openCV, tout marche bien, j'arrive à calibrer mes deux caméras ensuite j'arrive à rectifier les deux images prises (gauche et droite) et donc j'arrive à mettre tous les points du crayon de limage de gauche sur la même ligne que leurs points correspondants sur limage droite. (Ont le même Y)

    Le souci maintenant est de trouver l’écart en X. mes points ont le même Y mais j'arrive pas à trouver l'écart en X, si g bien compris c'est ce que l'on appelle la disparité.
    Quand je génère ma carte de disparité avec la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvFindStereoCorrespondenceBM( img1r, img2r, disp,BMState)
    . j'obtiens une carte de disparité.

    Dans la doc de la fonction il y a ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void cvFindStereoCorrespondenceBM( const CvArr* left, const CvArr* right,
                                       CvArr* disparity, CvStereoBMState* state );
    disparity
    The output single-channel 16-bit signed disparity map of the same size as input images. Its elements will be the computed disparities, multiplied by 16 and rounded to integer's.
    En gros si g bien compris, ça multiplie les disparité par 16 et ça les arrondi à des entiers. Le souci c'est que je n'arrive pas à me servir de ma carte de disparité.

    Elle a 640/480 pixels, par exemple la disparité qui est à la coordonnée 12, 30 (par exemple) correspond à quoi ? C'est la disparité que je dois additionner au point de l'image gauche de coordonnée 12,30 pour obtenir son correspondant dans limage de droite ou bien c'est l'inverse ?

    Au secours svp, ça fait deux jours que je suis bloqué !!

    En fait ce qui me pose un problème concrètement c'est de savoir comment pour un point connu sur l'image gauche trouver automatiquement son correspondant sur l'image droite.


    Merci beaucoup !!!!

    je peux vous fournir mon code pour la calibration et la rectification!!

    J'allais oublier, je ne comprends pas ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    z =pixel.valuedisparity;
    x =pixel.x ;
    y =pixel.y;
    créer vertex (x,y,z);
    moi je n'ai pas de paramètre .valuedisparity. ma carte qui s'appelle par exemple dismap n'a pas ce paramètre .
    Je n'ai que ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    disp->cols
    disp->data
    disp->rows
    disp->refcount
     
    etc
    et quand je parcours tous les pixels de ma carte de disparité, j'utilise la fonction cvGet2D(disp_map,l,c) où l est la ligne et c la colonne, ça me renvoi des valeurs que je divise par 16. en fin de compte j'obtiens des valeurs que je ne comprends pas trop, j'obtiens une grande série de 65,65,65,65,65.... 63,63,63,63 etc.


    merci pour votre aide .......
    si vous me débloquez je paye un grand coup
    merci

Discussions similaires

  1. Reconstruction 3D par Stéréovision active (caméra,laser,mire)
    Par appouch dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 05/12/2008, 19h23
  2. Reconstruction d'index
    Par superfly dans le forum Oracle
    Réponses: 22
    Dernier message: 23/03/2006, 16h58
  3. Réponses: 4
    Dernier message: 16/12/2004, 13h56
  4. Reconstruction de base
    Par alxkid dans le forum Administration
    Réponses: 13
    Dernier message: 11/03/2004, 12h10
  5. reconstruction de date
    Par Jayce82 dans le forum ASP
    Réponses: 3
    Dernier message: 23/10/2003, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo