Problème avec cvTransform
Bonjour à tous,
Je suis en train de développer un programme, avec la librairie OpenCV, qui nessecite de transformer un ensemble de points 2D (x,y,w) par une matrice de transformation 3x3. Mais voilà, une fois que l'appel à cette fonction a été fait (sans soucis), je ne peux plus accéder aux valeurs des points : le prog plante.
Je suis débutant avec OpenCV aussi je fais peut-être une énorme bourde dans mon code alors j'en mets un extrait :
list<CvPoint3D32f> xs1; //déjà initialisé et contient bien les coordonnées
double C1[3][3] = {0}; //matrice de transformation déjà initialisée
double **xs1Arr = (double **)cvAlloc(sizeof(double *) * nb_pts); /*nb_pts est le nombre de points, nb_pt = xs1.size();*/
list<CvPoint3D32f>::iterator it_xs = xs1.begin();
for(int i = 0;it_xs != xs1.end();it_xs++, i++)
{
xs1Arr[i] = (double *)cvAlloc(sizeof(double) * 3);
xs1Arr[i][0] = it_xs->x;
xs1Arr[i][1] = it_xs->y;
xs1Arr[i][2] = it_xs->z;
}
/*Pour pouvoir utiliser la fonction cvTransform, j'utilise un CvMat*/
CvMat xs1Mat = cvMat(nb_pts, 1, CV_32FC3, xs1Arr);
CvMat transmat1 = cvMat(3, 3, CV_32FC1, C1);
cout << xs1Arr[0][0] << " " << xs1Arr[0][1] << " " << xs1Arr[0][2] << endl; //Affichage OK
cvTransform(&xs1Mat, &xs1Mat, &transmat1); //exécution sans plantage
cout << xs1Arr[0][0] << " " << xs1Arr[0][1] << " " << xs1Arr[0][2] << endl; //Plantage...
Merci d'avance si quelqu'un peut m'aider !
Gus
Le problème venait du formatage des données
J'ai finalement trouvé le problème qui lié au fait que je sois débutant avec OpenCV.
Avant que je ne trouve la solution, je stockais mes données dans des tableau 2D (aussi bien pour les coordonnées des points que pour la matrice de transformation) 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.
Le code corrigé et fonctionnel est donc :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
list<CvPoint3D32f> xs1; //déjà initialisé et contient bien les coordonnées
double C1[9]; //matrice de transformation déjà initialisée {L1, L2, L3}
float *xs1Arr = (float *)cvAlloc(sizeof(float) * nb_pts * 3),
*xs1ArrRes = (float *)cvAlloc(sizeof(float) * nb_pts * 3);
/*nb_pts est le nombre de points, nb_pt = xs1.size();*/
it_xs = xs1.begin();
for(i = 0;it_xs != xs1.end();it_xs++, i++)
{
xs1Arr[i] = it_xs->x;
xs1Arr[++i] = it_xs->y;
xs1Arr[++i] = it_xs->z;
}
CvMat xs1Mat = cvMat(nb_pts, 1, CV_32FC3, xs1Arr), xs1MatRes = cvMat(nb_pts, 1, CV_32FC3, xs1ArrRes);
CvMat transmat1 = cvMat(3, 3, CV_32FC1, C1);
cvTransform(&xs1Mat, &xs1MatRes, &transmat1);
//xs1ArrRes est alors le tableau *float qui contient les coordonnées transformées |
Le problème était donc lié à la méconnaissance d'OpenCV... :oops:
J'espère que ce post aura été utile pour quelqu'un !