0

サイズがNxNのImage<Gray, Byte>trainImageがあり、サイズがの1DtrainMatrixに変更したいと思いMatrix<float>ます(N^2)x1

私がやろうとしているのは、を呼び出すことCvInvoke.cvCalvCovarmatrix()です。私が使用Matrix<Single>[]している最初のパラメーターについては、に変換しIntPtr[]ます。

Matrix<Single> avg = new Matrix<float>(7, 1);
Matrix<Single> cov = new Matrix<float>(7, 7);
Matrix<Single>[] input = new Matrix<float>[3];
for (int i = 0; i < 3; i++)
    input[i] = new Matrix<float>(7, 1);

IntPtr[] inObjs = Array.ConvertAll<Matrix<Single>, IntPtr>(input, delegate(Matrix<Single> mat) { return mat.Ptr; });

CvInvoke.cvCalcCovarMatrix(inObjs, 3, cov, avg, COVAR_METHOD.CV_COVAR_NORMAL);

しかし今、私はImage<Gray, Byte>[]各画像サイズ(仮定しましょう)7x7の入力を持っています。Matrix<float>に変更する前に、まず各画像を49x1のサイズに変換する必要があると思いますIntPtr[]。どうやってするの?

4

1 に答える 1

0

あなたは正しい道を進んでいます。emgucv 共分散の例が他にないため、他のコードの例としても役立つコードをいくつかここに示します。

      Matrix<float> mat1 = new Matrix<float>(1, 3);
      mat1[0, 0] = 38;
      mat1[0, 1] = 55;
      mat1[0, 2] = 49;

      Matrix<float> mat2 = new Matrix<float>(1, 3);
      mat2[0, 0] = 43;
      mat2[0, 1] = 54;
      mat2[0, 2] = 4;

      Matrix<float> cov = new Matrix<float>(3, 3);

      Matrix<float> avg = new Matrix<float>(2, 1);

      Matrix<float>[] input = new Matrix<float>[2];
      input[0] = mat1;
      input[1] = mat2;          
      IntPtr[] inputPtrs = Array.ConvertAll<Matrix<Single>, IntPtr>(input, delegate(Matrix<Single> mat) { return mat.Ptr; });
      CvInvoke.cvCalcCovarMatrix(inputPtrs, 2, cov, avg, COVAR_METHOD.CV_COVAR_NORMAL);

計算された wolfram の値に対して cov 行列の値をチェックしたところ、問題ないようです。

頑張れ、ルカ

于 2012-09-12T00:23:41.263 に答える