在CV_MAT_ELEM中编译错误

时间:2012-10-31 06:16:27

标签: opencv macros compiler-errors

由于调用了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”时,它会编译。但我无法想象这是解决方案(或者无法想象这是一个错误,我是唯一注意到它的人)。那真的有什么不对呢?

谢谢!

2 个答案:

答案 0 :(得分:1)

您不能像这样访问mat元素。对于遍历,请在此处查看我的其他答案,并附带示例代码: color matrix traversal

或参见opencv refman for grayscale Mat:

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

答案 1 :(得分:0)

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