1

PCACompute を呼び出すと固有ベクトルがすべて 0 になるため、Android Opencv2.3.1 の PCACompute にこの問題があります。その後、次のコードを使用して、100X100 マットを 1 つのマット 1X10000 に変換します。

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枚の写真を撮ると、次のコードを使用して写真のすべてのマットを1つのマットに挿入します:

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 列の入力 Mat であり、平均と固有ベクトルは出力行列です。平均行列では結果が得られますが、固有ベクトルではすべて 0 になります。この問題の解決を手伝ってもらえますか? よろしくお願いします。

4

1 に答える 1

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);
于 2012-02-16T21:07:47.093 に答える