了解Opencv的CV Mat结构中的地址计算

时间:2014-06-09 03:12:05

标签: arrays opencv

我不明白二维数组的地址Mat给定点的结构计算如下:

addr(M_ {i,j})= M.data + M.step [0] * i + M.step [1] * j

为什么???

M.step [i]> = M.step [i + 1](事实上,M.step [i]> = M.step [i + 1] * M.size [i + 1] )

例如,如果我们有一个大小为5X10的二维数组。我知道如何计算点(4,7)的地址的方式如下:

地址= 4 + 7 * 5

有人可以解释一下吗?

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

1)你所说的地址是数组中的索引,而不是计算机内存中的地址。例如,如果您的数组占用10000到20000之间的内存,则点(0,0)的像素地址为10000,而不是0。

2)图像可能有多个通道,像素值可能使用多个字节。例如,如果您有3个通道的矩阵并且像素是整数(即4个字节),则步骤[1]是3x4 = 12个字节。此类数组中(0,5)处像素的地址为10000 + step [0] x 0 + 12 x 5.

3)此外,您的计算缺少矩阵在内存中可能不连续的事实,即在一行的结尾和下一行的开头之间可能存在一些差距。这也包含在步骤[0]中。

只是一个建议:不要过多地使用所有这些计算步骤。如果您需要访问图像使用功能中的随机像素' at()',如果您按行处理行,请使用' ptr()'获取指向行开头的指针。这将为您节省大量计算和潜在的错误。