当我运行此代码时
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[0]
和M.data.ptr
之类的其他变体,但只是出现了正常错误并且为null这两个输出分别为。
我将如何通过解除引用数据结构成员而不使用函数i / e cvGet2D来访问1.0 ...以防万一它的emacs这样做我认为id报告我在Ubuntu Saucy上使用Emacs ...
答案 0 :(得分:1)
您没有读取正确的字节数。 data
字段的大小为8位(uchar)。你应该投射指针:
cout << *((double *)M.data.ptr) << endl;
或使用OpenCV为您提供的getter:
cout << M.at<double>(0, 0) << endl;
/* yet another possibility */
cout << *M.ptr<double>(0) << endl;
答案 1 :(得分:1)
您正尝试使用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;