2012-09-11 1 views
0

크기가 NxN 인 Image<Gray, Byte> trainImage가 있는데, (N^2)x1 크기의 1D Matrix<float> trainMatrix로 변경하고 싶습니다.이미지 <Gray, Byte>을 1D 매트릭스 <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>[] 인 입력이 7 × 7 (의 가정하자)를. 나는 IntPtr[]으로 변경하기 전에 각 이미지를 크기 49x1 인 Matrix<float>으로 먼저 변환해야한다고 생각합니다. 그것을하는 방법?

+0

2D 매트릭스입니까? 왜냐하면 1D 행렬은 벡터입니다. –

+0

오 예, 벡터입니다. 그러나 형식이 행렬이므로 행렬에 N^2 행과 열만 있습니다. – maru1414152

+0

[이 질문] (http://stackoverflow.com/questions/7367770/how-to-flatten-or-index-3d-array-in-1d-array)에서 확인할 수 있습니다. 약 3d 배열이지만 매우 비슷합니다. IMO. 그러나 문제는 2D에 대한 해결책이 이미 주어 졌다는 것입니다. –

답변

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