2012-02-02 46 views
1

在Android Opencv2.3.1中PCACompute有这个问题,因为当我打电话给PCACompute时,我的特征向量都是0.所以,我为每个人拍摄10张照片,并将它保存到100X100的Mat中。 之后,将我的100X100垫一垫1X10000与此代码:PCACompute Opencv return eigenvectors = 0

double [] elem = null; 
for(int riga=0;riga<m.rows();riga++) 
    { 
    for(int colonna=0;colonna<m.cols();colonna++) 
    { 
    elem = m.get(riga, colonna); 
     mrow.put(0,((riga*100)+colonna), elem[0]); 
    }//for colonna 
}//for riga 

之后,当我把10张照片,我插入照片的所有垫成一个垫子,此代码:

double b[] = null; 
    for (int i = 0; i< listafoto.size(); i++) 
    { 
    Mat t = listafoto.get(i); 
     for(int riga = 0;riga<t.rows();riga++) 
     { 
     for(int colonna =0;colonna<t.cols();colonna++) 
     { 
      b = t.get(riga, colonna); 
      datiOriginali.put(i, colonna, b[0]); 
     }//for colonna 
    }//for riga 
}//for lista e contemporaneamente riga datiOriginali 

之后,我打电话PCACompute与此代码:`

org.opencv.core.Core.PCACompute(datiOriginali,mean, eigenvectors, 10);` 

所以,datiOriginali是10行和10000点的cols输入垫,平均值和本征矢量是输出马特里X。平均矩阵给我一个结果,但特征向量给我全部0.你能帮我解决这个问题吗? 在此先感谢.MArco

回答

2

我基于我的代码示例http://www.bytefish.de/blog/pca_in_opencv。 以下是我的工作方式:

Vector trainingImages = new Vector();; 
    trainingImages.add(Highgui.imread("/sdcard/facedatabase/s1/1.pgm",0)); 
    trainingImages.add(Highgui.imread("/sdcard/facedatabase/s1/2.pgm",0)); 

    Mat x = (Mat) trainingImages.get(0); 
    int total = x.rows() * x.cols(); 

    // build matrix (column) 
    // This matrix will have one col for each image and imagerows x imagecols rows 
     Mat mat = new Mat(total, trainingImages.size(), CvType.CV_32FC1); 
     for(int i = 0; i < trainingImages.size(); i++) { 
      Mat X = mat.col(i); 
      Mat c = (Mat) trainingImages.get(i); 
      c.reshape(1,total).convertTo(X, CvType.CV_32FC1); 
     } 

    Mat eigenVectors = new Mat(); 
    Mat mean = new Mat(); 
    Core.PCACompute(mat, mean, eigenVectors);