2014-10-17 5 views
0

cvMat에있는 데이터에 액세스하려고합니다. 여기 cvMat에서 데이터에 액세스하는 방법

내 코드입니다 :

// Declare 
int rank = 3; 
CvMat* warp_matrix = cvCreateMat(rank,rank,CV_32FC1); 

// Using 
cvGetPerspectiveTransform(imgSrc,imgDst,warp_matrix); 

for(int i=0; i<rank; i++) 
{ 
    for(int j=0; j<rank; j++) 
    { 
     std::cout << warp_matrix->data[i][j] << std::endl; 
    } 
} 

하지만 오류 잡기 :

error: no match for 'operator[]' (operand types are 'CvMat::<anonymous union>' and 'int') 

을 그리고 나는 그것을 해결하는 방법을 모르는 -이 같은 CV_MAT_ELEM()을 시도해보십시오

std::cout << CV_MAT_ELEM(warp_matrix,double,i,j) << std::endl; 

그리고 여전히 작동하지 않습니다 (이 오류를 잡으십시오) :

error: request for member 'cols' in 'warp_matrix', which is of pointer type 'CvMat*' (maybe you meant to use '->' ?) 

나는 지금 무엇을 해야할지 잘 모릅니다. 너 나 좀 도와 줄 수있어?

+1

귀하의 질문의 제목은이 있음을 명시 적입니다 *** C,하지 C++ ***. 그러나 여러분이 제공하는 코드 예제는 분명히 C++입니다. (예 :'std :: cout'). – ryyker

+1

당신은'printf ("% f", cvmGet (warp_matrix, i, j));'*** [here] (http://note.sonots.com/OpenCV/MatrixOperations.html)에서 해봤습니까 *** – ryyker

답변

0

매크로 CV_MAT_ELEM을 사용하십시오. 그것은 cvMat에 대한 포인터가 아닌 cvMat를 기대합니다. 오히려 포인터를해야하는 경우 : MX는 [행] [COL] 스타일의 액세스가 작동하지 않는다, 그래서 이러한 한 차원 것을

mx->data.ptr; // uchar 
mx->data.i; // int 
mx->data.s; // short 
mx->data.db; // double 
mx->data.fl; // float 

참고 :

mx->data; 

은 (유형별) 포인터의 이름이 조합이다 . 고려 예 :

CvMat * mx = cvCreateMat(3, 4, CV_32FC1); 
LOG->PrintLn("%u x %u", mx->cols, mx->rows); 
for(uint rdx = 0; rdx < mx->rows; ++rdx) 
{ 
    for(uint cdx = 0; cdx < mx->cols; ++cdx) 
    { 
     CV_MAT_ELEM(* mx, float, rdx, cdx) = (1 + rdx) * 10 + cdx; 
     LOG->Print("\t%.1f", mx->data.fl[ mx->cols * rdx + cdx ]); 
    } 
    LOG->PrintLn(); 
} 

(. 행렬이 imgsrc 및 imgDst 그래서 난 변환을 생산 할 수 없습니다 귀하의 예제에서 선언되지 않음)