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

Why do i get this ^@ when i attempt to access the first element of a CvMat data struct member

本文关键字:元素 第一个 访问 CvMat 成员 数据结构 为什么      更新时间:2023-10-16

当我运行这段代码时

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

您正在尝试使用 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友好为您提供的getters:

cout << M.at<double>(0, 0) << endl;
/* yet another possibility */
cout << *M.ptr<double>(0) << endl;