2013-02-08 50 views
0

我想對當前的數據集執行PCA,我有8組數據,對於每條數據,我有618條關於它的信息。下面是到目前爲止我曾嘗試的代碼:用於使用Emgu的數據集的PCA

 double[,] RawData = new double[8, 618]; 

     for (int i = 0; i < 8; i++)//Copies Data to Emgu Matrix 
     { 
      for (int j = 0; j < 618; j++) 
      { 
       double val = Convert.ToDouble(DataList[i][j]); 
       RawData.SetValue(val, i, j); 
      } 
     } 

     Matrix<Double> DataMatrix = new Matrix<Double>(RawData); 
     Matrix<Double> Mean = new Matrix<Double>(1, 618); 
     Matrix<Double> EigenValues = new Matrix<Double>(1, 618); 
     Matrix<Double> EigenVectors = new Matrix<Double>(618, 618); 

     CvInvoke.cvCalcPCA(DataMatrix, Mean, EigenValues, EigenVectors, Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL); 

     Matrix<Double> PC1 = new Matrix<Double>(1, 618); 
     for (int i = 0; i < 618; i++) 
      PC1[0, i] = EigenVectors[0, i]; 

     Matrix<Double> Results = new Matrix<Double>(8, 1); 

     CvInvoke.cvProjectPCA(DataMatrix, Mean, PC1, Results); 

     TestStatus.Items.Add("PCA Projection Results = "); 
     for (int i = 0; i < 8; i++) 
     { 
      TestStatus.Items.Add(Convert.ToString(DataMatrix[i, 0])); 
     } 

Emgu.CV.Util.CvException:OpenCV的:(evals0.cols == 1 || evals0.rows == 1)& & ecount0 < = ecount & & evects0.cols == evects.cols & & evects0.rows == ecount0

在Emgu.CV.CvInvoke.CvErrorHandler(的Int32狀態,字符串了funcName,字符串ERRMSG,字符串文件名,行的Int32,IntPtr的用戶數據)

Emgu.CV上的

f:\ Project \ Project 3.0 \ Project 3.0 \ MainWindow中的Project_3._0.MainWindow.Capture_3D_Face_Click(Object sender,RoutedEventArgs e).CvInvoke.cvCalcPCA(IntPtr data,IntPtr avg,IntPtr eigenvalues,IntPtr eigenvectors,PCA_TYPE flags) 。 xaml.cs:行516

正在由線路引​​起的:(這是在上面的代碼)

 CvInvoke.cvCalcPCA(DataMatrix, Mean, EigenValues, EigenVectors, Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL); 

如何建立正確的矩陣爲PCA發揮作用?

回答

0

您可以查看emguCV的源代碼並查看錯誤中提及的行中的哪些條件被觸發。由於我只有OpenCV,所以我無法再提供幫助,因爲我的PCA版本沒有這樣的說法。

也可能有一些像「你必須使用浮動不是雙重」的魔術。

+0

的雙打似乎做工精細。我發現這些括號(1,618)應該是(1,8)和(618,618)應該是(8,8)。雖然現在我遇到了CvInvoke.cvProjectPCA(Data,Mean,EigenVectors,Results)的問題;不要以爲你知道結果矩陣的大小應該是多少? – difurious 2013-02-09 22:57:41

+1

你是指投影矩陣?在[OCV PCA文檔](http://docs.opencv.org/modules/core/doc/operations_on_array.html#pca-project)中,它表示它將具有與輸入矩陣一樣多的列,並且綁定行無論是由maxComponents或用於創建PCA的座標數量,所以我敢打賭618. – morynicz 2013-02-09 23:40:43

+0

是的抱歉的投影矩陣,我試圖創建一個矩陣的大小(8,8),(1,8),(1,618 ),(8,618)和(618,618)以及所有這些的倒數。但似乎沒有任何工作。到目前爲止,我得到它的唯一方法是將其作爲方矩陣,用值8替換全部618,並將原始特徵向量矩陣放入項目函數中。 – difurious 2013-02-10 12:37:09

1

在您所提供的代碼,應該不會是

Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_ROW 

,而不是

Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL 

(注意每個sencence的最後3個字符)