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!