когда я запускаю этот код
double a[]={1.0,2.0,3.0,4.0};
CvMat M=cvMat(8,8,CV_8UC1, a);
cout<<"M.data.ptr="<< M.data.ptr[0]<<endl;
для доступа к 1.0, первому элементу матрицы, я получаю вывод M.data.ptr=^@
как ни странно, я попытался скопировать вывод cout в это? и ^@
не будет копировать.. я получил только M.data.ptr
когда я M.data.ptr
... Я связал другие варианты, такие как M.data.ptr[0]
и M.data.ptr
но получил нормальную ошибку и null выход для этих 2 соответственно. как бы я хотел получить доступ к 1.0, разыменовывая элемент структуры данных, а не используя функцию i/e cvGet2D... на всякий случай, если ее emacs, который делает это, я думал, что я сообщаю im, используя Emacs на Ubuntu Saucy...
Вы пытаетесь инициализировать матрицу с элементами типа double
, но создаете матрицу типа CV_8UC1
. Кроме того, прямой доступ к указателю возвращает исходный указатель (типа unsigned char
) на базовые данные. Вы должны интерпретировать этот указатель как double*
для получения фактических значений. То, что вы пытаетесь сделать, может выглядеть примерно так:
double a[]={1.0,2.0,3.0,4.0};
CvMat M = cvMat(8,8,CV_64FC1, a);
double* data_ptr_64f = (double*)(M.data.ptr);
cout<<"M.data.ptr="<< data_ptr_64f[0]<<endl;
Вы не читаете правильное количество байтов. Поле data
имеет размер 8 бит (uchar). Вы должны либо наложить указатель:
cout << *((double *)M.data.ptr) << endl;
или используйте получатели, которые OpenCV любезно предоставит вам:
cout << M.at<double>(0, 0) << endl;
/* yet another possibility */
cout << *M.ptr<double>(0) << endl;