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 :

Déterminer les coordonnées 3D d'un système stéréo


Sujet :

OpenCV

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut Déterminer les coordonnées 3D d'un système stéréo
    Bonjour,
    je suis en train de train sur la meilleur solution afin de déterminer les coordonnées 3d à partir d'un couple d'image mis en correspondance.
    Pouvez me donner plusieurs pistes, et surtout celles qui sembleraient être les plus précises sachant que je dispose des paramètres de calibration du système (matrice intrin/extrinsèque et fondamentale).

    Merci pour votre aide!
    A+

  2. #2
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Une simple triangulation fait l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    int Stereo::GetDisparity(IplImage *disp_map, CvPoint right)
     
     
     
    		{
     
    		///////////////////////////////////////////////////////////////////////////////////
     
    		//The GetDisparity method get the value of disparity for a given 2D point
     
    		//The 2D point is a point of the right image.
     
    		//Knowing the disparity and the right coordinates of the points we will be able 
     
    		//To compute the 3D coordinates of the point
     
    		//Reminder : 
     
    		//Z=b/D   =====> D = (y'-y), b is the remaining coeeficient of the right cam to left cam transform matrix (correspondng gto y axis tanslation)
     
    		//X=xZ
     
    		//Y=yZ
     
    		///////////////////////////////////////////////////////////////////////////////////
     
    		uchar disp_value;
     
     
     
    		disp_value = ((uchar*)(disp_map->imageData+disp_map->widthStep*right.y))[right.x];
     
    		//printf("Disp : %i\n",disp_value);
     
    		return (int)disp_value;
     
    		}
     
    //////////////////////////////////////////////////////////////////
     
    CvPoint3D32f Stereo::compute3Dcoordinates(CvPoint right, float b, int disparity)
     
    	{
     
    	double x,y,z;
     
        float f = f_rect;
     
    	z = (b*f / disparity);
     
    	x = (right.x * z)/f /**1.02e-3*/;
     
    	y = (right.y * z)/f /**0.9375e-3*/;
     
    	//z = (b / disparity)*600;
     
    	//x = right.x * z *3e-4;
     
    	//y = right.y * z *3e-4;
     
    	if (x!=0 && y!=0 && disparity )
     
    	{
     
    	printf("x=%f , y=%f , z=%f  \n",x,y,z);
     
    	}
     
    	/*z = z*600;
     
    	x = x*600*5.6e-4;
     
    	y = y*600*5.6e-4;
     
    	*/
     
    	//printf("x=%f cm, y=%f cm, z=%f cm \n",x*634*5.6e-4,y*634*5.6e-4,z*634);
     
    	return cvPoint3D32f(x,y,z);
     
     
     
    	}
    Voila mon code pour ça

  3. #3
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    Bonjour,

    J'ai regardé votre code et je ne vois pas à quoi correspond f_rect (=> distance focale surement) mais comment l'obtenir ?
    Merci pour votre aide

  4. #4
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    effectivement f correspond à la focale rectifiée qui etait (honte a moi ) en global dans mon code de vision 3D

    elle est obtenu grace à la matrice des paramètres intrinsèques.

  5. #5
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    Bonjour,
    J'ai pleins de questions
    1) Comment déterminer b (est ce que c'est un élément de la matrice essentielle du style transformation, si oui sur l'axe z?)
    2) J'ai du mal a voir comment obtenir la disparité théoriquement et dans votre code
    3) Pourquoi f = focal rectifié et pas la focal de base (pb qui vient de la correspondance?)

    Merci pour ces éclaircissements ça m'aide beaucoup

  6. #6
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Alors quelques réponses

    1-Pour b faut que je recherche je sais plus
    2-Pour trianguler il faut avoir la correspondance entre les deux images, je pense que la on est d'accord. Donc une fois la correspondance établie tu crée une carte de disparité et la valeur de chaque pixel de cette carte de disparité correspond à la disparité (la distance sur la ligne en gros) entre un point de l'image droite (resp gauche) avec son correspondant dans l'image de gauche (resp droite)
    3-La réponse est dans ta question : la correspondance est réalisée sur des images rectifiées, donc f_rect, enfin il faudrait que je refasse les shémas pour avoir les idées claires mais bon...

    Alors b mmhhhh dans mes souvenirs correspond à la distance intra caméra
    Je confirmerai ça mais sinon je te conseille ce livre :
    http://perception.inrialpes.fr/peopl...re-hermes.html

  7. #7
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    Bonjour,

    Pour la focale rectifié j ai quelque probleme. En fait la triangularisation n'est possible que si on applique une rotation aux images afin de "simuler" le fait que les lignes des axes optiques soient parallèles non?

    Comment trouvé cette rotation. Je suis un peu perdu

    Merci pour votre aide

  8. #8
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Mmh, precise moi donc ce que tu veux faire exactement?
    As tu des correspondances pré établies ou veux tu faire ça pour l'ensemble de l'image. L'approche à retenir diffère

  9. #9
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    En gros, pour un point donné je veux obtenir sa coordonnées 3D. Or, j'ai vu dans le code que vous m'avez donné et ds la doc que tout ceci est possible si on passe au préalable par une phase de rectification de repere (sauf erreur de ma part)

    -Hormis cela comment obtenez vous votre focal rectifié => quels mécanismes mettez vous en place?

    -Pour une image entière ca parait interessant pouvez vous me donner des infos.

    Merci

  10. #10
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Bon, je vais essayer de prendre un peu de temps
    A la limite je crois qu'il pourrait même être intéressant de faire un petit tuto la dessus si j'arrive à remettre de l'ordre dans mes sources.

    prenons deux images , celles de la doc tiens (pas d'autre sous la main)

    Ces deux images forment une paire d'image stéréo. Dans le cas de ces images la paire est dite rectifiée : la rectification est un processus qui consiste à réaliser une rotation spatiale du repère des deux images de la paire stéréoscopique de manière a les amener dans un plan "image rectifié", correspondant ç un plan dans lesquelles les lignes épipolaires seront parallèles.

    en gros on essaye de passer d'une configuration de ce type :
    à une configuration de ce type, ou les plans images sont parallèles :


    Jusque la tout va bien j'imagine?
    Alors j'imagine qu'une qeustion qui se pose est : mais à quoi ça sert. Tout simplement à simplifier la recherche de correspondance dans une image : chercher la correspondance c'est, en gros chercher le point qui ressemble le plus dans l'autre image. On peut imaginer le faire sur tout les pixels de l'image mais le temps pris serait énorme et ça risquerai d'entrainer beaucoup d'erreurs. Or la géométrie épipolaire nous permet de réduire ce champ de recherche à une ligne dans l'image. Mais les lignes épipolaires ne sont pas tout ce qu'il y a de plus droites... Pour simplifier le probleme et rechercher des correspondant "sur la même ligne" dans l'image correspondante on a mis en place la rectification épipolaire, qui consiste donc à ramener les deux images dans un même plan, comme explicité sur les deux images précédentes (je chercherai à en mettre des meilleures je pense)

    Donc je récapitule :

    - Calibration du capteur Stéréoscopique
    - On en déduit la géométrie épipolaire
    - On applique la rectification épipolaire (personnellement j'utilise une adaptation de l'algorithme d'A.fusiello (http://profs.sci.univr.it/~fusiello/) on peut aussi utiliser la toolbox matlab de J.Y.Bouguet (http://www.vision.caltech.edu/bouguetj/) )
    - On pratique la stéréocorrelation (l'algorithme de Birchfield, implanté dans open cv offre des résultats corrects (même si c'est plus de la 3D par plans mais bon, c'est real time ce qui est loin d'être le cas de mes algorithmes persos utilisant la transformée de census =))
    -On a a la sortie la carte de disparité qui est inversement proportionnelle à la distance des points.


    Bon voila un début en tout cas, j'essayerai de continuer et de préciser ça, on peut essayer de commencer un tuto avec code etc sur la stéréoscopie si vous voulez.

    Mais cela dit si votre application est simplement de réaliser un clic de point, image gauche image droite puis de vouloir la distance de ce point ça peut être envisageable sans passer par tout ça avec la géométrie épipolaire.

    Pareil, si on a pas besoin de tout les points d'une image, la rectification est une étape "complexe" à mettre en place pour pas grand chose, mais du coup si on ne la met pas en place la triangulation est beaucoup plus délicate à envisager. je sais pas si je m'explique bien mais la rectification permet surtout de simplifier énormément la géométrie épipolaire.

    Bon, bref, j'y reviendrai plus tard :o

  11. #11
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    Bonjour,

    Merci pour la réponse. J'ai pas mal avancé grâce à vos conseils éclairés !
    Pour ce qui est du tuto, pourquoi pas si ça intéresse des personnes. Pour ce qui est du code je peux modestement aidé.

    Pour ce qui est de la détermination des coordonnées 3D j'utilise maintenant la géométrie épipolaire avec intersection des droites en choisissant le milieu de la distance entre les 2 droites. Cela dit j'ai lu récemment qu'on pouvait amélioré ces calculs j'ai d'ailleurs la doc si ça intéresse.

    Pour ce qui est de la carte de disparité et de la phase de reconstruction 3D je trouve peu de code et de doc facilement abordable (peut être ai-je mal cherché ) En tout cas si vous avez des illustrations de code je suis intéressé.

    Merci

  12. #12
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Hello,

    Pour la phase de reconstruction 3D je ne m'y suis jamais interessé, a mon avis il suffit de faire un maillage une fois que tu as assez de coordonnées 3D.

    Pour ce qui est de l'obtention de la carte de disparité, j'avais développé des méthodes, mais qui sont restées tout à fait expérimentales. SI tu veux tester tu peux utiliser la fonction cvFindStereoCorrespondances d'OpenCv.
    J'essayerai de mettre du code ici dans les prochains jours.

  13. #13
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Par défaut
    Je suis face moi aussi a un probleme de stéréovision.
    Je dispose de 2 images de la meme scène prises par deux caméras différentes.Je connais les parametres internes de chaque caméra, mais le but est de ne pas avoir a faire de mesure des parametres externes.(rotation translation).
    A partir des deux images, j'ai calculé la matrice fondamentale (estimation avec 8 points) et j'ai vérifié que cette matrice est juste en représentant les lignes épipolaires qui me donnent des résultats cohérents.
    J'aimerais savoir comment ( et si il est possible) de trouver les coordonnées réelles 3D d'un point cliqué sur chacune des images sans avoir fait les mesures de la matrice externe (position des caméras, angles de mesures).

    Merci

  14. #14
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    La position 3D d'un point est forcément liée aux caractéristiques de ton système stéréoscopique. Cela étant tu fais la calibration de ton système une fois pour toute ; tant que tes caméras ne bougent pas l'une par rapport à l'autre il est inutile de recalibrer.

  15. #15
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Par défaut
    Il est donc necessaire de mesurer tous les parametres externes du systeme (X,Y,Z et les 3 angles) pour chacune des caméras, n'existe t il pas de methode permettant de réduire le nombre de mesures?

  16. #16
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    tu utilises quoi comme méthode pour faire ça?
    la toolbox matlab de j y bouguet ou cvcalibratecamera2 permettent de faire ça assez "simplement"

  17. #17
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Par défaut
    j'utilise openCV

  18. #18
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Par défaut
    j'ai vu que connaissant les parametres internes des cameras, il est possible d'utiliser FindExtrinsicCameraParams2 cependant je ne vois pas trop a quoi correspondent les parametres de cette fonction ( les 2 premiers)

  19. #19
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Les deux premiers coeefs correspondent aux positions detectées sur le damier des intersections noir et blanc.
    repère objet te image dans mes souvenirs.
    faudrrait que je ressorte le code

  20. #20
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    Salut,

    Param 1: coordonnées 3D de ton damier dans le repère objet,
    Param 2: les coordonnées 2D des points d'intérêt de la mire de calibration dans le repère objet (souvent obtenu par la fonction cvFindChessBoardCorners),
    Param 3: la matrice intrinsèque (souvent obtenu par cvCalibrateCamera),
    Param 4: les paramètres de distorsion (idem),
    Param 5: les paramètres de rotation (idem),
    Param 6: les paramètres de translation (idem),

    pour les 2 premiers Vinss avait (encore ) raison.

    A+

Discussions similaires

  1. [Python 2.X] Déterminer les coordonnées d'un rect -Pygame-
    Par Marty_and_Doc dans le forum Programmation multimédia/Jeux
    Réponses: 3
    Dernier message: 21/05/2015, 18h42
  2. Déterminer les coordonnées d'un usercontrol
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 12/09/2007, 17h41
  3. Déterminer les coordonnés d'un cercle
    Par nizartu dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/03/2007, 15h51
  4. Déterminer les coordonnées d'une image
    Par blaise4714 dans le forum Images
    Réponses: 2
    Dernier message: 27/11/2006, 19h05
  5. Réponses: 4
    Dernier message: 27/11/2006, 18h06

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