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); |
Partager