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