2012-09-11 59 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

相關問題