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 :
Merci de m'aider, car l'affaire commence à me gonfler copieux.
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; } }![]()
Partager