使用Emgu进行数据集的PCA

时间:2013-02-08 19:39:42

标签: c# opencv emgucv

我正在尝试在数据集上执行PCA,目前我有8组数据,对于每个数据,我有618条有关它的信息。下面是我到目前为止尝试的代码:

        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)&amp;&amp; ecount0&lt; = ecount&amp;&amp; evects0.cols == evects.cols&amp;&amp; evects0.rows == ecount0

at Emgu.CV.CvInvoke.CvErrorHandler(Int32 status,String funcName,String errMsg,String fileName,Int32 line,IntPtr userData)

at Emgu.CV.CvInvoke.cvCalcPCA(IntPtr data,IntPtr avg,IntPtr eigenvalues,IntPtr eigenvectors,PCA_TYPE flags)    在F:\ Project \ Project 3.0 \ Project 3.0 \ MainWindow.xaml.cs中的Project_3._0.MainWindow.Capture_3D_Face_Click(Object sender,RoutedEventArgs e):第516行

这是由行引起的:(在上面的代码中)

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

如何正确设置矩阵以使PCA正常运行?

2 个答案:

答案 0 :(得分:1)

在您提供的代码中,不应该是

Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_ROW

而不是

Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL

(注意每次发作的最后3个字符)

答案 1 :(得分:0)

您可以查看emguCV的源代码,并查看错误中提到的行中的哪些条件被触发。因为我只有OpenCV,所以我无能为力,因为我的PCA版本没有这样的断言。

可能还有一些魔法,比如“你必须使用浮动而不是双重”。