2014-10-17 4 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)),' From *** [здесь] (http://note.sonots.com/OpenCV/MatrixOperations.html) *** – ryyker

ответ

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 

Обратите внимание, что это одна мерная, так тх [строка] [столбец] доступ стиль не должен работать , Рассмотрим пример:

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 не объявлены в вашем примере, так что я не мог произвести преобразование)