Résultats aberrants avec cvSVD
Bonjour,
Je travaille sur l'estimation d'homographie à partir de points appariés dans deux iamges dans une application où je travaille avec OpenCV et je souhaite implanter une méthode basée sur la SVD (méthode de Hartley). J'aimerais donc utiliser la fonction cvSVD d'OpenCV seulement, même si elle ne plante pas le moins du monde, les résultats renvoyés sont aberrants, contrairement à ceux obtenus sous Matlab avec les mêmes données.
Y a-t-il quelque chose de particulier à savoir sur l'utilisation de cette fonction ?
Voici une partie de mon code :
Code:
1 2 3 4 5
|
CvMat AMat = cvMat(nb_pts, 4, CV_32FC1, A), VMat = cvMat(4, 4, CV_32FC1, V), *UMat = cvCreateMat(nb_pts, 4, CV_32FC1), SMat = cvMat(4, 1, CV_32FC1, S);
cvSVD(&AMat, &SMat, UMat, &VMat, CV_SVD_MODIFY_A); |
où A, V et S sont des tableaux de double alloués avec cvAlloc dont les tailles correspondent à celles entrées pour la création de CvMat (nb_pts=16 dans mon travail du moment).
A contient des coordonnées sous la forme suivante :
A_i = [x_i, y_i, x_i', y_i']
où (x,y) sont les coordonnées d'un point dans l'image 1 et (x',y') celles du point correspondant dans l'image 2. En voici un exemple :
0.4550 0.1182 0.4543 0.1185
-1.7094 1.1855 -1.7093 1.1856
-1.7154 0.1454 -1.7157 0.1452
0.4037 0.1705 0.4039 0.1711
0.8219 -0.9531 0.8215 -0.9528
0.3991 0.1175 0.3991 0.1175
0.6858 -0.9501 0.6853 -0.9504
0.3883 1.2441 0.3877 1.2450
0.4021 -0.9547 0.4027 -0.9550
1.0180 -0.9437 1.0182 -0.9430
1.0117 1.2412 1.0119 1.2414
0.4032 -0.9021 0.4032 -0.9021
-1.6643 0.1454 -1.6646 0.1458
0.3859 1.1893 0.3876 1.1883
-1.6869 -0.8909 -1.6870 -0.8909
0.4012 0.0374 0.4010 0.0356
Matlab donne, pour les valeurs singulières :
5.76 4.61 0.002 0.001
Alors que cvSVD donne :
8046.48 9.83e-5 0 0
Merci d'avance pour vos lumières car je ne vois vraiment pas le problème...
Gus
Le problème venait du formatage des données
J'ai finalement trouvé le problème qui est lié au fait que je sois débutant avec OpenCV. :oops:
Avant que je ne trouve la solution, je stockais mes données dans des tableau 2D (aussi bien pour la matrice à décomposer que pour les matrices de valeurs et vecteurs singuliers) alors qu'en fait, les structures CvMat utilisent des données 1D formattée selon les paramètres passés à cvMat, à savoir la largeur et la hauteur de la matrice et le type de données utilisé.
Un autre problème était lié au format des données car je pensais à tort que le type CV_32FC1 correspondait à double alors qu'il correspondait à float.