我有Image<Gray, Byte>
trainImage,大小为NxN,我想将其更改为大小为Matrix<float>
的1D (N^2)x1
trainMatrix。
我要做的是致电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>
之前,我需要先将每张图片转换为IntPtr[]
,尺寸为49x1。怎么做?
答案 0 :(得分: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);
我检查了针对computed wolfram ones的cov矩阵值,看起来没问题。
我最好的, 卢卡