0

作为调用estimateRigidTransform() 的结果,我得到一个名为“trans”的cv::Mat 对象。为了检索其包含的矩阵,我尝试以这种方式访问​​其元素:

for (i=0; i<2; i++) for (j=0; j<3; j++)
{
   mtx[j][i]=CV_MAT_ELEM(trans,double,i,j);
}

不幸的是,使用 VS2010 我得到一个编译器错误

error C2228: left of '.ptr' must have class/struct/union

对于带有 CV_MAT_ELEM 的行。当我打开这个宏时,我发现类似

(mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))

当我删除 (mat).data 后面的“.ptr”时,它会编译。但我无法想象这是解决方案(或者无法想象这是一个错误,我是唯一注意到它的人)。那么这里真的有什么问题呢?

谢谢!

4

2 回答 2

1

您不会像这样访问 mat 元素。对于遍历,请参阅我的其他答案以及示例代码: 颜色矩阵遍历

或查看灰度垫的opencv refman:

Mat M; // should be grayscale
int cols = M.cols, rows = M.rows;
for(int i = 0; i < rows; i++) 
{
  const double* Mi = M.ptr<double>(i); 
  for(int j = 0; j < cols; j++)
  {
    Mi[j]; // is the matrix element.
  }
}
于 2012-11-02T10:33:11.697 回答
0

只是我这边的一个附录:同时我发现 CV_MAT_ELEM 需要一个结构 CvMat (OpenCV-C-interface)而不是 cv::Mat (C++-interface)。这就是为什么我得到这个有趣的错误。从 cv::Mat 到 CvMat 的转换可以简单地通过转换为 CvMat 来完成。与 OpenCV 中的 C 和 C++ 接口的有趣混淆......

于 2012-11-06T09:16:52.580 回答