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 :

Images stéréo, matrices fondamentale et de position de caméra 3D


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 633
    Par défaut Images stéréo, matrices fondamentale et de position de caméra 3D
    Bonjour,

    j'ai lu pas mal de documents sur le sujet ainsi que les discutions de ce forum, mais je sèche toujours sur mon problème.

    Je m'explique :

    Je dispose de deux images stéréo (gauche et droite )
    Elle ne sont pas rectifiées épipolairement parlant mais rectifiées dans le sens ou toute les ligne qui devraient être droites sont droites.
    Elles ont donc été corrigées avec la matrice de distorsion de la caméra. ( d'après ce que j'en ai comprit )

    Je cherche à afficher les positions des deux caméra gauche et droite dans l'espace. (via opengl )

    Je me suis dit que la matrice fondamentale, était une matrice 3x3 de rotation qui permettait de convertir les points de la camera gauche vers celle de la camera droite.

    Donc je me suis dit << Banco >>, je crée la position de la première camera arbitrairement, et je multiplie la matrice de position de la camera gauche à la matrice fondamentale pour obtenir la matrice de position de la camera droite.

    Et j'obtiens n'importe quoi, dans le sens ou la camera droite ne s'est jamais affichée.
    J'ai fait un test de projection matricielle avec un point choisi {5,8,10} et je l'ai retrouvé à {0,000021, 0,000035, 0.000048} donc invisible.

    Je suis dans l'impasse, donc je vois plusieurs possibilités :
    - ma matrice fondamentale est mal calculée ( je pense pas car j'ai utilisé la fonction cvFindFundamentalMat en RANSAC avec 320 points de l'image mit en concordance qui me renvoi une seule matrice ( voir mon code )
    - L'idée que je me fait de la matrice fondamentale est complètement erronée, et dans ce cas j'aimerais qu'on m'explique ce qu'elle est
    - la projection du point via la matrice est mal faite, c'est possible vu ma connaissance des matrices.
    - les matrices Opencv et Opengl n'ont rien à voir. ( j'avais entendu dire que Opengl utilisaient des matrices différente et que la conversion directe d'une matrice normale et d'une matrice Opengl était impossible. jamais remis la main sur cette discution )
    - autres

    Code pour Trouver la matrice fondamentale que j'ai fait d'après la doc :
    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
     
    CvMat* CalcFundamentalMatrix(CvPoint2D32f *pointsOfPict1, CvPoint2D32f *pointsOfPict2, int CountPoints)
    	{
    		CvMat* points1 = cvCreateMat(2,CountPoints,CV_32F);
    		CvMat* points2 = cvCreateMat(2,CountPoints,CV_32F);
     
    		CvMat* status = cvCreateMat(1,CountPoints,CV_8UC1);
     
    		CvMat* fundamental_matrix = cvCreateMat(3,3,CV_32F);
     
    		/* Fill the points here ... */
    		for ( int i = 0; i < CountPoints; i++) 
    		{
    			cvmSet(points1, 0, i, pointsOfPict1[i].x);
    			cvmSet(points1, 1, i, pointsOfPict1[i].y);
     
    			cvmSet(points2, 0, i, pointsOfPict2[i].x);
    			cvmSet(points2, 1, i, pointsOfPict2[i].y);
    		}
     
    		int fundamental_matrix_count_finded = cvFindFundamentalMat( points1, points2, fundamental_matrix, CV_FM_RANSAC, 1.0, 0.99, status );
     
    		if ( fundamental_matrix_count_finded == 0 )
    			return NULL;
    		else
    			if ( fundamental_matrix_count_finded == 1 )
    				return fundamental_matrix;
    			else
    				if ( fundamental_matrix_count_finded > 1 )
    				{
    					CvMat* mat = cvCreateMat(3,3,CV_32FC1);
     
    					for ( int i = 0 ; i < fundamental_matrix_count_finded ; i++ )
    					{
     
    					}
     
    					return mat;
    				}
    	}
    Merci de m'aider, car l'affaire commence à me gonfler copieux.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    Je ne peux pas vraiment répondre à ta question, étant plutôt compétent sur la partie programmation que "théorie de l'image". Cependant, il existe justement un forum dédié au à la théorie du traitement de l'image, tu y trouveras peut être plus d'infos qu'ici :
    forum traitement d'images

    Bonne chance,

    G.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 633
    Par défaut
    Merci, je vais voir ça.

    Si quelqu'un a malgré tout des information supplémentaires, je suis preneur.

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Par défaut Concernant le problème de la matrice fondamentale
    Bonjour,
    Je ne suis pas un expert dans le domaine de la vision par ordinateur, mais je vais essayer d'apporter quelques éléments de réponse à votre problème concernant la matrice fondamentale.
    Si j'ai bien compris, vous voulez déterminer la position et l'orientation de la deuxième caméra relativement à la première, et ce en utilisant les points mis en correspondance des deux images.
    En effet, la matrice fondamentale peut être très utile pour cette fin, mais surtout pas en l'utilisant comme vous avez tenté de le faire car la matrice fondamentale n'est pas une matrice de rotation. La matrice fondamentale peut servir à estimer La Matrice Essentielle E avec l'équation :
    E = Transposée(K)*F*K où K est la matrice de calibrage interne des deux caméra (j'espère qu'elles sont identiques) et F la matrice fondamentale.
    Une fois E estimée, la décomposition en valeurs singulières de cette dernière peut vous aider à retrouver Le vecteur de translation que vous semblez négliger et la matrice de rotation.
    Je sais que ça peut vous sembler assez vague comme je le présente mais je vais essayer de vous joindre un lien qui vous permettra de télécharger une thèse de Doctorat traitant de ça.
    http://193.49.104.5/GEIDEFile/ThseP...E8sePessel_PDF
    Je vous conseille de lire tout les chapitres qui concernent la géométrie épipolaire. Et puis y a un dernier truc je n'ai pas compris comment vous avez essayé de vérifier la validité de la matrice fondamentale avec des points!!
    Eh, Au fait il vaut mieux que vous choisissiez les points à apparier manuellemnt si vous avez le choix car les méthodes automatiques donnent quelque fois des données aberrantes.
    Dernière remarque si vous pensez que la thèse ne traite que la vision monoculaire (une seule caméra), sachez que c'est la même chose avec votre cas puisque après déplacement d'une caméra on se retrouve dans le même cas de la stéréo.
    Enfin c'est ce que je pense, je répète encore une fois je ne suis pas un spécialiste.
    Bon courage et merci de m'informer de vos progrès car moi aussi je suis très intéressé par ce domaine.

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 633
    Par défaut
    Merci pour votre document.

    Il est génial et pourtant j'en ait trouvé beaucoup sans vraiment tombé sur ce que je cherchait ^^

    En fait je ne m'intéresse pas a la stéreovision mais bien a la reconstruction 3D avec un monoculaire, sous entendu qu'une camera en mouvement donne d'une certain façon une image gauche et droite.

    Effectivement je n'avais rein comprit a la matrice fondamentale, et depuis ce post j'ai fait du chemin.

    J'ai pu vérifier la validité de la matrice fondamentale en traçant les Epiline.

    Sur mes 320 lignes j'ai deux aberration donc en effectuant une moyenne des intersection je suis sur de trouver mes epipole pour récupérer la matrice de la seconde caméra. ( j'en suis la ^^ )

    cependant j'aimerais me concentrer sur une méthode plus rapide purement matricielle.

    par contre je comprend bien votre formule mais comment la résoudre :
    E = Transposée(K')*F*K. comme ils 'agit d'un monoculaire et que le zoom ne fonctionne pas K et K' sont identique.

    Je dit sans zoom car j'imagine que le zoom modifiant la focale il faudrait re-déterminer la matrice de distorsion de la camera pour cette focale.

    Dans mon cas les image sont corrigé via la matrice de distorsion, mais je m'intéresse a ce cas de figure.

    Voila.

  6. #6
    Nouveau candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Par défaut La matrice de calibrage interne
    Bonjour,

    Oui, puisque la camera n'effectue pas de zoom, on admet logiquement que la

    matrice de calibrage interne K reste fixe pendant tout le fonctionnement.

    Cette matrice de calibrage interne K est estimée ou déterminée par un

    calibrage préalable Off Line. Si vous cherches dans le Net vous trouverez

    plein d'astuces pour la déterminer. Ensuite vous n'aurez plus qu'à déterminer

    la pose (position et rotation de la deuxième caméra) pour pouvoir reconstruire

    les points.

    Bon courage et s'il y a du nouveau n'hésitez pas à poster des remarques ou

    des questions.

Discussions similaires

  1. Reconstruction 3D à partir de 2 images stéréos
    Par wombatz dans le forum Traitement d'images
    Réponses: 17
    Dernier message: 18/12/2008, 13h23
  2. RANSAC pour le calcul de la matrice fondamentale
    Par faroukus dans le forum OpenCV
    Réponses: 1
    Dernier message: 19/10/2008, 21h40
  3. Matrice fondamentale ?
    Par faroukus dans le forum OpenCV
    Réponses: 1
    Dernier message: 23/08/2008, 23h05
  4. image vers matrice
    Par hassiba_45 dans le forum C++Builder
    Réponses: 13
    Dernier message: 16/04/2008, 16h18
  5. comment transformer une image en matrice
    Par liliana07 dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/03/2007, 14h53

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