0

当我运行这段代码时

      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但分别为这两个变体得到了正常错误和空输出。我将如何通过取消引用数据结构成员而不使用函数 i/e cvGet2D 来访问 1.0...以防万一它的 emacs 这样做我认为 id 报告我在 Ubuntu Saucy 上使用 Emacs...

4

2 回答 2

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;
于 2013-10-11T15:09:18.180 回答
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;
于 2013-10-11T15:16:28.047 回答