2014-10-17 117 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 2015-09-22 13:13:59

+1

您是否试过'printf(“%f”,cvmGet(warp_matrix,i,j));'***从*** [here](http://note.sonots.com/OpenCV/MatrixOperations.html)*** – ryyker 2015-09-22 13:20:40

回答

0

使用宏CV_MAT_ELEM。它期望一个cvMat而不是一个指向cvMat的指针。如果而是需要指针:

mx->data; 

是(每类)的指针的一位不愿透露姓名的工会:

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

注意,这些是一维的,所以MX [行] [COL]的方式来访问不得上班。考虑例如:

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在你的例子没有声明,所以我不可能产生变换)