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

  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

  10. #10
    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
    oula, dsl mais tu t embrouille beaucoup.
    Si tu as rectife tes images pour avoir tes lignes epipolaire parallele et que tu utilise cvFindStereoCorrespondenceBM. Alors il te reste plus qu'a reconstruire.

    Pour te mettre un peu de code est que mon exemple soit moins abstrait peut etre ....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void cvFindStereoCorrespondenceBM( const CvArr* left, const CvArr* right,
    CvArr* disparity, CvStereoBMState* state );
    left = image gauche rectifie
    right= image droite rectifie
    IplImage*imgDisparity = cvCreateImage(cvGetSize(imgLeft),IPL_DEPTH_16S,1); la carte de disparite en retour ....

    state = Les differents parametre de la SAD multiresolution

    Quand au IPL_DEPTH_16S, c'est juste pour te signaler qu'il stock ses donnees dans short.


    Tu peu deja affiche ta carte de disparite pour voir si tu a quelque chose de pas trop pourri lol (mais franchement la correlation de'opencv est pas terrible a mon gout ....).

    Et dans ta carte de disparity tu a la distance du correpondant dune image a l autre par exemple

    le correspondant du pixel X1 , Y1 de l'image Left ce trouve en ( X1+ cvGet2D(imgDisparity ,X1 ,Y1 ).val[0] ) , Y1 sur l'image Right mais comme je te les dis il se peut que la carte de disparite genere soit pouris ....... c'est pour ca que je programme le mien ou que je cherche d autre algorithme de correlation (votre les precedent post ... openvis3D ...).


    Quand a ca :

    z =pixel.valuedisparity;
    x =pixel.x ;
    y =pixel.y;
    creer vertex (x,y,z);


    Bien evidement tu as pas ca lol en code si tu aime utilise la fonction cvGet2D ca deviens genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        CvScalar scalaire ;
        for (int py = 0; y < imgDisparity->height; py++)
        {
            for (int px = 0; x < imgDisparity->width; px++)
            {
    		scalaire=cvGet2D(imgDisparity ,py,px);
    		z = scalaire.val[0];
                    y = py;
                    x = px;
                    //stockage des valeurs ..
            }
        }

    J'espere te debloquer mais j'habite San Diego alors pour le grand coup .....

  11. #11
    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 Paris san diego !!
    Re salut, merci beaucoup pour ton aide !! Si tu m'invite à San Diego je te payerai un gros cocktail, sinon si tu es de passage à Paris, pas de souci....

    Je vais essayer de poster mes deux images rectifiées + la carte de disparité pour que tu me donnes ton avis.

    Quand je fais ça: X1 , Y1 de l'image Left se trouve en ( X1+ cvGet2D(imgDisparity ,X1 ,Y1 ).val[0] ) , Y1) ça ne marche pas terrible. je pense qu'il faut que je revoie mes réglages de CvSereoBMState* state.

    Par rapport aux valeurs de ma carte de disparité j'obtiens des grandes valeurs 1000, 1004 ... il faut bien les diviser par 16 !! non ?

    image gauche rectifiée:

    image droite rectifiée:

    Rectification:


    la rectification marche bien.

    voici mon gros problème, c'est la carte de disparité:


    voici mes réglages:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CvStereoBMState *BMState = cvCreateStereoBMState();
            assert(BMState != 0);
            BMState->preFilterSize=41;
            BMState->preFilterCap=31;
            BMState->SADWindowSize=41;
            BMState->minDisparity=-64;
            BMState->numberOfDisparities=64;
            BMState->textureThreshold=10;
            BMState->uniquenessRatio=15;
    Voici un exemple des disparités que j'obtiens (après les avoir divisés par 16):
    (c =colonne, l=ligne)
    c=0 l=0 disp=-9.625000
    c=1 l=0 disp=-9.625000
    c=2 l=0 disp=-9.625000
    c=3 l=0 disp=-65.000000
    c=4 l=0 disp=-65.000000
    c=5 l=0 disp=-65.000000
    c=6 l=0 disp=-65.000000
    c=7 l=0 disp=-65.000000
    c=8 l=0 disp=-65.000000
    c=9 l=0 disp=-65.000000
    c=10 l=0 disp=-65.000000
    c=11 l=0 disp=-65.000000
    c=12 l=0 disp=-65.000000
    c=13 l=0 disp=-65.000000
    c=14 l=0 disp=-65.000000
    c=15 l=0 disp=-65.000000
    c=16 l=0 disp=-65.000000
    c=17 l=0 disp=-65.000000
    c=18 l=0 disp=-65.000000
    c=19 l=0 disp=-1.000000
    c=20 l=0 disp=-1.000000
    c=21 l=0 disp=-1.000000
    c=22 l=0 disp=-1.000000
    c=23 l=0 disp=-1.000000
    c=24 l=0 disp=-1.000000
    c=25 l=0 disp=-1.000000
    c=26 l=0 disp=-1.000000
    c=27 l=0 disp=-1.000000
    c=28 l=0 disp=-1.000000
    c=29 l=0 disp=-1.000000
    c=30 l=0 disp=-1.000000
    c=31 l=0 disp=-1.000000
    c=32 l=0 disp=-1.000000
    c=33 l=0 disp=-1.000000
    c=34 l=0 disp=-65.000000
    .... etc
    Si tu as des conseils stp.

    J'ai essayé de regarder le code que tu a mis de OPENVIS3D, j'avoue que je n'ai pas réussi à comprendre comment ça marche, mai je souhaite d'abord tout essayer avec openCV parce que je suis en retard dans mon projet.

    Merci beaucoup pour ton aide.
    Bon week-end.

  12. #12
    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
    La rectification a l'air correct mais ca ce voi tu premier tout d'oeil que ta carte de disparite est naze. Regarde ce lien http://vision.middlebury.edu/stereo/data/ tu y trouvera des exemples d'images rectifies et leur carte de disparite en voyant ces resustats tu va vite comprendre que la tienne ne peut pas de donner une reconstruction 3d correct.
    Regarde bien tes reglages de CvStereoBMState de premiere vue moi je baisserai les parametre genre un truc comme ca :

    BMState->SADWindowSize=11;
    BMState->minDisparity=-128;
    BMState->numberOfDisparities=256;

    Et enleve tout le reste tu a pas besoin de filtre dans un premier temps (ca sans le copier coller de l'exemple opencv ^^ j'avais fait pareil au debut ^^)

  13. #13
    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 Au secours !!
    Salut, merci beaucoup pour tes conseils.

    Je souhaiterais tester ma carte de disparité avec OPEN3Dvis pour la comparer avec OPENCV, c'est pour cela que je voulais savoir si tu n'avais pas de tutoriel pour utiliser OPENvis3D.

    Comment je pourrais intégrer ce code à mon projet OPENCV ? De quel fichier j'ai besoin ??

    Merci.

  14. #14
    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
    Tout est explique dans le lien de google, il suffis de lire les readme. Franchement ca s'integre sans aucun soucis. Il doit y avoir 17 fichiers dont 2 fichier cpp (les autres etant des .h). Apres tu recupere la fonction du main qui fait le calcul de la disparite et tu l'integre dans ton code. C'est vraiment simple, 10 minutes au plus.

  15. #15
    Invité de passage
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Par défaut Fonction inconnu
    Salut, d'abords je tiens a vous remercier pour toutes ces infos. De plus je me sens moins seul face à mon projet.
    Pour info, mon projet est de calculer une distance avec 2 cameras pour placer un appareil médical sur un patient.
    J'ai deux images parfaitement calibrées, pour ca y a pas de souci. Pour calculer une distance il me faut l'écart entre les mêmes points des deux images. J'ai fait une fonction qui est sensée retrouver les deux points mais j'ai un problème que je ne comprend pas (cette fonction a du fonctionné 5 minutes hier ^_^).
    Donc j'ai lu attentivement le topic et j'ai trouvé cette fonction (pour avoir une image de disparité ...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void cvFindStereoCorrespondenceBM( const CvArr* left, const CvArr* right,
    CvArr* disparity, CvStereoBMState* state );
    Je l'implante dans mon code, mais manque de pot elle n'est pas reconnue, alors que j'utilise OPenCV (sous Visual Studio 2005).
    Voilà je sais pas comment faire pour régler mon problème, je sens que j'y suis presque, enfin bon.

    A+ merci d'avance.
    PS: si vous comprenez pas ou si vous avec besoin de quoi que se soit, je me ferai un plaisir de satisfaire toutes vos envies !!! (dans la mesure du raisonnable).

  16. #16
    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
    Bah... verifie l'ecriture de ta fonction, genre une majuscule mal place (ca arrive a tout le monde). Fait un copier coller : cvFindStereoCorrespondenceBM

    Sinon verifie que tu as bien inclue cv.h.

    Je sais pas quoi te dire.

  17. #17
    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 genizz Voir le message
    Salut, d'abords je tiens a vous remercier pour toutes ces infos. De plus je me sens moins seul face à mon projet.
    Pour info, mon projet est de calculer une distance avec 2 cameras pour placer un appareil médical sur un patient.
    J'ai deux images parfaitement calibrées, pour ca y a pas de souci. Pour calculer une distance il me faut l'écart entre les mêmes points des deux images. J'ai fait une fonction qui est sensée retrouver les deux points mais j'ai un problème que je ne comprend pas (cette fonction a du fonctionné 5 minutes hier ^_^).
    Donc j'ai lu attentivement le topic et j'ai trouvé cette fonction (pour avoir une image de disparité ...):
    void cvFindStereoCorrespondenceBM( const CvArr* left, const CvArr* right,
    CvArr* disparity, CvStereoBMState* state );

    Je l'implante dans mon code, mais manque de pot elle n'est pas reconnue, alors que j'utilise OPenCV (sous Visual Studio 2005).
    Voilà je sais pas comment faire pour régler mon problème, je sens que j'y suis presque, enfin bon.

    A+ merci d'avance.
    PS: si vous comprenez pas ou si vous avec besoin de quoi que se soit, je me ferai un plaisir de satisfaire toutes vos envies !!! (dans la mesure du raisonnable).
    J'ai eu le meme probleme
    as tu bien suivis la procédure d'installation et d'initialisation comme définie sur le site d'opencv?
    si tu penses que oui, et que ca ne fonctionne toujours pas, cela signifie que tu as un probleme avec la library en elle meme (ca m'est arrive avec la version 1.1 que ce soit avec visual 2005 comme 2008).
    pour cela tu as deux solutions possible, la premiere et longue et compliaquee je ne perdrai donc pas mon tps a te la decrire.
    cependant la seconde, est simple. desinstalle la version1.1 et installe la version 1.0, qui fonctionne tres bien.

    amuse toi bien avec

    lien des version d'opencv: http://sourceforge.net/projects/opencvlibrary/files/

  18. #18
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Bonjour,

    J'essaie comme vous d'obtenir une carte de disparité, à partir d'un couple d'images pour lesquelles je connais deja :
    - La focale
    - Les paramètres de distorsion (en fait, les images sont même deja corrigées)
    - et les parametres extrinsic (POSITION : X Y Z, et ROTATION : matrice 3x3)

    Mais je ne comprends pas très bien la doc...

    Si j'ai bien compris, je dois alimenter :

    cvFindStereoCorrespondenceBM()

    avec un couple d'images rectifiées (distorsion + position) avec :

    cvRemap( img, img_rectifiee, matrice_x, matrice_y )

    Mais je ne comprends pas comment je dois construire mes matrices pour la fonction cvRemap ?

    Merci pour votre aide !

  19. #19
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Par défaut
    Bon j'ai un peu progressé par moi même !

    Mais quand même je bloque un peu sur la theorie de manipulation des matrices de rotation.

    Rappel : je dispose
    - de la matrice de rotation 3x3 de la photo 1 : MR1
    - de la matrice de rotation 3x3 de la photo 2 : MR2

    - des focales et parametres de distorsion

    - des positions x,y,z de la photo 1 : P1
    - des positions x,y,z de la photo 2 : P2

    En sachant qu'en plus c'est de l'appariemment vertical et non pas droite gauche ! Mais en reprenant l'exemple de la doc, j'ai reussi a implementer tout ça...

    Donc j'ai bien compris qu'il fallait alimenter cvStereoRectify() avec
    - MRcomposee (difference d'orientation entre les deux photos)
    - et Pcomposee (difference de position)

    Donc pour la difference de position, pas de problème, mais je ne suis pas sur de bien realiser le calcul pour la difference de rotation... Je fais (sans grand succes) :

    cvMatMul(MR1,MR2,MRcomposee)

    mais mes lignes epipolaires ne sont pas alignées (gasp !)

    J'ai fait tourner les parametres dans tous les sens, mais pas moyen de rectifier correctement. Du coup ma disparity map ne ressemble pas à grand chose...

    C'est pas le bon calcul n'est ce pas ?

    Par ailleurs, est ce qu'il ne risque pas d'y avoir un problème avec l'orientation des x,y,z (il faut que l'axe des Z soit normal à la photo c'est ça ?) ???

    Merci d'avance !

  20. #20
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut calibration 3D avec opencv
    Salut tout le monde,

    Je viens de commencer le travail avec opencv et je veux réaliser une calibration 3D avec opencv je sais comment je dois me procéder pourriez vous m'aider pour commencer, merci de m'envoyer des tuto qui peuvent m'aider.

    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