0

我有一个Image<Gray, Byte>大小为 NxN 的 trainImage,我想将其更改为Matrix<float>大小为 的一维 trainMatrix (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 回答