0

現在、8セットのデータがあり、データごとに618個の情報があるデータセットで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、文字列 fileName、Int32 行、IntPtr userData) で

Emgu.CV.CvInvoke.cvCalcPCA (IntPtr データ、IntPtr avg、IntPtr eigenvalues、IntPtr eigenvectors、PCA_TYPE フラグ) で Project_3._0.MainWindow.Capture_3D_Face_Click (オブジェクトの送信者、RoutedEventArgs e) で f:\Project\Project 3.0\Project 3.0 \MainWindow.xaml.cs:516行目

これは次の行によって引き起こされています:(上記のコードにあります)

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

PCA が機能するように行列を正しく設定するにはどうすればよいですか?

4

2 に答える 2

1

あなたが提供したコードでは、そうではありません

Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_ROW

それ以外の

Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_COL

(各センテンスの最後の 3 文字に注意してください)

于 2013-03-07T10:31:02.840 に答える
0

emguCV のソース コードを調べて、エラーに記載されている行のどの条件がトリガーされているかを確認できます。私は OpenCV しか持っていないので、私のバージョンの PCA にはそのようなアサーションがないため、これ以上のことはできません。

「doubleではなくfloatを使用する必要がある」などの魔法も含まれている可能性があります。

于 2013-02-09T11:38:47.673 に答える