假设有个Mat a(4,3,CV_8UC3)
,也就是有4行,3列,3通道,数据类型是8位无符号数。在保存的时候就是用3维数组表示,即[[b,g,r,],[b,g,r],...,[b,g,r]]
,bgr代表一个8位无符号的数值。形象点写就是
[[[b,g,r],[b,g,r],[b,g,r]],
[[b,g,r],[b,g,r],[b,g,r]],
[[b,g,r],[b,g,r],[b,g,r]],
[[b,g,r],[b,g,r],[b,g,r]]]
elemSize()
一个位置所有通道的元素的字节数。也就是一个[b,g,r]的字节数,为3
elemSize1()
一个位置一个通道的元素字节数,也就是一个b/g/r的字节数,为1。
也就是说,elemSize()=elemSize1()*channels()
step
step是一个数组,保存了各个维度的的字节数。
例子中是2维矩阵,step[0]保存第一维的大小。第一个维度是行,也就是褪去最外层括号后,最大的元素的字节数为9.
step[1]保存第二个维度元素的大小。第二个维度是每行再向下分,去掉第二层括号后,最大的元素的字节数,也就是是3.
elemSize()和step[dims-1]是相等的
附上RGB三色值的获取方法
#define addrB(mat,i,j) (mat.data + mat.step[0] * i + mat.step[1] * j + mat.elemSize1() * 0)
#define addrG(mat,i,j) (mat.data + mat.step[0] * i + mat.step[1] * j + mat.elemSize1() * 1)
#define addrR(mat,i,j) (mat.data + mat.step[0] * i + mat.step[1] * j + mat.elemSize1() * 2)
Mat a(3,4,CV_8UC3)
*addrB(a,1,1)