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 utilisation de cvCalcCovarMatrix


Sujet :

OpenCV

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Problème utilisation de cvCalcCovarMatrix
    Bonjour à tous!

    Je suis en train d'implémenter une méthode de reconstruction de surface à partir d'un nuage de point non structuré.
    Pour cela, je dois approximer la normale en chaque point. Pour chaque point, je détermine ces k-plus proches voisins. Je détermine la normale en utilisant une analyse en composante principale. Et à ce niveau que j'ai un problème: j'utilise la méthode "cvCalcCovarMatrix" pour déterminer la matrice de covariance des k-ppv. Le vecteur propre correspondant à la plus petite valeur propre sera la normale cherché.

    Voici le code:
    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
     
    // 2. calcul matrice de covariance
     
        CvMat **srcMatrix;
        CvMat *M=cvCreateMat(1,K,CV_32FC1);
        srcMatrix=&M;
     
        for (unsigned int j=0; j<iKppv.size(); j++) {
          srcMatrix[j]=cvCreateMat(1,3,CV_32FC1);
          cvmSet(srcMatrix[j],0,0,pt[iKppv[j]][0]);
          cvmSet(srcMatrix[j],0,1,pt[iKppv[j]][1]);
          cvmSet(srcMatrix[j],0,2,pt[iKppv[j]][2]);
        }
        CvMat *cov=cvCreateMat(K,K,CV_32FC1);
        CvMat *avgVector=cvCreateMat(1,3,CV_32FC1);
        cvCalcCovarMatrix((const void **) srcMatrix ,K, cov, avgVector, CV_COVAR_NORMAL); 
        // cvCalcCovarMatrix((const void **)srcMatrix,K,cov,avgVector,CV_COVAR_SCRAMBLED);
     
        // 3. valeur propre matrice de cov
        CvMat* vectP  = cvCreateMat(K,K,CV_32FC1);  //vecteurs propres de cov
        CvMat* valP  = cvCreateMat(K,1,CV_32FC1);  //valeurs propres de cov
        double eps= pow(10,-75);
        cvEigenVV(cov, vectP, valP,eps); 
     
        // 4. normale = vecteur propre de la plus petite valeur propre
        double norm;
        norm=sqrt(cvmGet(vectP,K-1,0)*cvmGet(vectP,K-1,0)+cvmGet(vectP,K-1,1)*cvmGet(vectP,K-1,1)+cvmGet(vectP,K-1,2)*cvmGet(vectP,K-1,2));
        normale=Vec3Df(cvmGet(vectP,K-1,0)/norm,cvmGet(vectP,K-1,1)/norm,cvmGet(vectP,K-1,2)/norm);
    J'ai effectué des tests:
    - lorsque K=3 avec le flag CV_COVAR_NORMAL pour cvCalcCovarMatrix tout fonctionne bien;
    - par contre, dès que j'augmente K j'ai une erreur avec le flag CV_COVAR_NORMAL. J'ai alors effectué des tests avec le flag CV_COVAR_SCRAMBLED mais je n'obtients pas le bon résultat.

    Auriez-vous une idée de mon erreur?

    Merci d'avance pour votre aide!

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    as tu essayé avec le flag CV_COVAR_ROWS ?

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse.
    J'ai essayé avec le flag CV_COVAR_ROWS, j'obtiens une erreur indiquant que la taille des arguments est mauvaise (OpenCV ERROR: Sizes of input arguments do not match () ).

    Pour plus de détails, avec les 5-plus-proches-voisins suivant:
    (1,0,0) ; (0,1,0) ; (0,0,0) ; (0,-1,0) ; (-1,0,0)
    j'obtiens comme normale : (0.71,0,0).

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    par contre, dès que j'augmente K j'ai une erreur avec le flag CV_COVAR_NORMAL
    de quelle type l'erreur ?

  5. #5
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    L'erreur obtenue pour K=4 avec CV_COVAR_NORMAL est la suivante:
    OpenCV ERROR: Sizes of input arguments do not match (The size of input vectors does not match with the size of covariation matrix)

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    une matrice de covariance n'est pas forcément carré.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvMat* vectP  = cvCreateMat(K,K,CV_32FC1);
    cette ligne n'est pas bonne, je dirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvMat* vectP  = cvCreateMat(K,3,CV_32FC1);
    y'a autant de ligne que dans tes vecteurs et autant de colonne que de vecteur

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je suis d'accord avec toi concernant mon erreur pour la déclaration de vectP, c'est corrigé! Mais, la même erreur persiste à l'exécution.

    Je ne vois pas ce que tu veux dire par:
    Citation Envoyé par snowpy Voir le message
    une matrice de covariance n'est pas forcément carré.
    Ma matrice cov est également mal déclarée?

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    oups j'ai copié la mauvaise ligne

    oui je parlais de Cov

  9. #9
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par snowpy Voir le message
    une matrice de covariance n'est pas forcément carré.
    Pourtant quand je modifie la déclaration de cov:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CvMat *cov=cvCreateMat(K,3,CV_32FC1);
    J'ai l'erreur suivante à l'exécution:
    OpenCV ERROR: Incorrect size of input array (Covariation matrix must be square)
    La matrice cov doit donc être carrée?

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    ah ben vi c'est aussi marqué dans la doc, j'ai un doute :
    CvMat *toto=cvCreateMat(m,n,CV_32FC1)

    si je prends cette matrice et que je la multiplie par sa transposé j'ai bien une matrice avec m colonnes n lignes non ?

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    Non snowpy une matrice (m,n) * (n,m) donne une matrice (n,n).
    Je pense que l'erreur dans ton code viens de la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    srcMatrix[j]=cvCreateMat(1,3,CV_32FC1);
    C'est explique dans la doc :
    CV COVAR NORMAL
    , that is, cov mat will be a covariance matrix with the same linear size as the total number of elements in each input vector.
    donc si tu passe une matrice de covariance en (4,4) par exemple ca ne marchera pas.
    Essaie ca et dis-nous.

  12. #12
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    ouiai en gros (ca va mieux en le fesant sur le papier lol) la taille de ta matrice de covariance est égal aux nombres d'élement dans un de tes vecteurs

    merci glen pour la précision pour moi ca donnait du (n,m) d'ou une incohérence de la doc

  13. #13
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Excuse moi glen1789 je ne comprends pas ce que tu veux dire car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    srcMatrix[j]=cvCreateMat(1,3,CV_32FC1);
    permet d'initialiser chaque ligne de srcMatrix par un point (ie. un kppv).
    Or les points sont bien des vecteurs 1x3. Donc je ne vois pas où modifier mon code.

  14. #14
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    en gros si tu fais passer une matrice de covariance (4,4) ben ton vecteur doit être en (1,4) mais la pour toi c'est l'inverse c'est ta matrice de covariance qui sera toujours une (3,3) et non (K,K) sauf si tu décide de changer le nombre d'élément dans tes vecteurs

  15. #15
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ca y est, j'Ok merci à vous 2

  16. #16
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    j'aurais du poser la question sur les matrices avant ca aurait évité pas mal de souci

  17. #17
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Désolé...
    Ca y est j'ai compris! Merci beaucoup à vous deux!

    Pour info voici les lignes que j'ai modifiées dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    srcMatrix[i]=cvCreateMat(3,1,CV_32FC1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvMat *cov=cvCreateMat(3,3,CV_32FC1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvMat *avgVector=cvCreateMat(3,1,CV_32FC1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvMat *avgVector=cvCreateMat(3,1,CV_32FC1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CvMat* vectP  = cvCreateMat(3,3,CV_32FC1);
    CvMat* valP  = cvCreateMat(3,1,CV_32FC1);
    Je vais faire d'autres tests mais ça à l'air de bien fonctionner!

  18. #18
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    ah non c'est moi qui suis désolé sans mon erreur on se serrait moins casser la tête (enfin moi en tout cas ^^) parce que j'étais en train de me dire que c'était complétement incohérent

    enfin bon Glen est venu à notre secours

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

Discussions similaires

  1. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [JSTL] [EL] Problème utilisation <c:out>
    Par XavierL dans le forum Taglibs
    Réponses: 7
    Dernier message: 14/08/2005, 20h12
  4. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  5. [JAR]Problème utilisation manifest et jar
    Par doudine dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/01/2005, 10h21

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