当我尝试访问CvMat数据结构成员的第一个元素时,为什么会得到这个^ @

时间:2013-10-11 14:58:20

标签: c++ opencv

当我运行此代码时

      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 ...

2 个答案:

答案 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;