2012-09-11 52 views
0

我有一个Image<Gray, Byte> trainImage的大小为NxN,我想将其更改为1D Matrix<float> trainMatrix,大小为(N^2)x1如何把Image <Gray, Byte>转换成1D Matrix <float>?

我想要做的是致电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。我想我需要将每张图像转换成尺寸为49x1的Matrix<float>,然后再将其更改为IntPtr[]。怎么做?

+0

你的意思是2D矩阵?因为一维矩阵是一个向量。 –

+0

哦,是的,一个向量,但类型是矩阵,这就是为什么矩阵有N^2行,只有1列。 – maru1414152

+0

你可以检查[这个问题](http://stackoverflow.com/questions/7367770/how-to-flatten-or-index-3d-array-in-1d-array)它是关于3D数组,但它非常相似IMO。但在这个问题上,已经给出了二维解决方案。 –

回答

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); 

我检查cov矩阵值对computed wolfram ones,他们似乎没问题。

我所有最好的, Luca

相关问题