如何使用.data访问OpenCV Vec3f Mat?

时间:2014-06-18 11:18:11

标签: c++ opencv

出于成像目的,我将Mat创建为

Mat_<Vec3f> I

如果这是一个Vec3b Mat,那么我知道如何使用.data方法来访问它的元素。

I.data[j*I.step + i*3 + x], where x={0,1,2}, j is row and i is column

我尝试用Vec3f做同样的事情,但以下所有内容都不起作用(抛出错误):

I.data[j*I.step + i*12 + x], where x={0,4,8}
I.data[j*I.step[0] + i*I.step[1]*3 + x], where x={0,4,8}
I.data[j*I.step[0] + i*I.step[1]*3 + x], where x={0,I.step[1],I.step[1]*2}

这样做的正确方法是什么?我选择使用.data以获得更高的执行速度(与.at和.ptr相比)。

2 个答案:

答案 0 :(得分:5)

首先尝试使用前门;)

Vec3f & pixel = I.at<Vec3f>(j,i); // row, col world

如果确实需要指针,至少使用:

Vec3f *pv = I.ptr<Vec3f>(j); // ptr to row j
pv[3][2] = 17; // 4th pixel, red channel

换句话说,尽可能避免访问原始uchar *数据

答案 1 :(得分:0)

你的问题是I.data是uchar *,所以你只检索浮点数的一个字节。

你需要像

这样的东西
float component = ((float*)(I.data + I.step.p[0]*j))[i * 3 + x];  // where x = {0, 1, 2}

好的,我只是从at()的OpenCV源代码中压缩了该代码并根据您的情况进行了调整。如果你需要随机访问像素,只要在at()中禁用调试断言,你就不会打败它。如果您按顺序访问像素,则可以采用更有效的方法:根据berak的答案获取一个指向行,并简单地遍历每一行。