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 :

Problème avec cvTransform


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Par défaut 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

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Par défaut 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 : 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
     
    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...
    J'espère que ce post aura été utile pour quelqu'un !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Plusieurs années plus tard, ce post m'aura été utile...

    Par contre, avec Opencv 1.0.0, le code donné ne fonctionne pas, car si xs1Mat est bien modifiée et contient bien la transformation des points, xs1Arr n'est pas modifié lors du cvTransform.

    Voici un exemple de code qui fonctionne avec Opencv1.0.0 pour transformer un seul point :
    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
     
     
    // matrice de transformation 2x3
    CvMat* affineTransformation = ...
     
    // Point de départ
    float src_x = ... 
    float src_y = ...
     
    // Point d'arrivée
    float dst_x;
    float dst_y
     
    // affineTransformation : 2x3
    // dst = affineTransformation * src
    // -> dst : 2x1
    //      src : 3x1
     
    CvMat* srcMat = cvCreateMat(1, 1, CV_32FC3);
    CvMat* dstMat = cvCreateMat(1, 1, CV_32FC2);
     
    CvScalar m;
    m.val[0] = src_x;
    m.val[1] = src_y;
    m.val[2] = 1.0;
    cvSet2D(srcMat, 0, 0, m);
     
    cvTransform(srcMat, dstMat, affineTransformation.getCVMatStruct());
     
    CvScalar dstScalar = cvGet2D(dstMat, 0, 0);
    dst_x = dstScalar.val[0];
    dst_y = dstScalar.val[1];
    Si on a plusieurs points à transformer, il faut ajouter autant de lignes qu'on a de points à srcMat et dstMat.

    En espérant que cela puisse servir à quelqu'un d'autre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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