opencv的Mat中step的解释

来源:互联网 发布:人民搜索网络股份公司 编辑:程序博客网 时间:2024/06/07 20:37

网络上对Mat的详解,绝大多数是翻译官方的manual,而官方的manual却恰好对部分(官方认为)我们平时很少使用的内容没有详细的解释,或者对一些实现没有解释细节,因此我们就很难在刚入门时迅速地对某些内容有详细的认识,Mat的step就其中之一

在经过数天对Mat的研究,也对step有一定的认识了,这里说出我的愚见以抛砖引玉,有不足或错误之处希望各位指出,谢谢。

其实对step成员数组的解释就是step的意思,只要翻译对了,就能明白step的意思,step的翻译在这里不应该被翻译为步脚步步骤步伐,而是” 梯级 “,也就是说step这里指出的是图像在各个梯级上的字节数大小,而这里的梯级指的是构成图像的名层次。

这里引用官方manual的几句话:


Note that M.step[i] >= M.step[i+1] (in fact, M.step[i] >= M.step[i+1]*M.size[i+1] ). This means
that 2-dimensional matrices are stored row-by-row, 3-dimensional matrices are stored plane-by-plane, and so on.


这句话可对刚入门图像处理的人(例如我~~)抓狂啊,为什么M.step[i]必定>= M.step[i+1]  ??为什么这能说明2-dimensional matrices are stored row-by-row, 3-dimensional matrices are stored plane-by-plane, and so on ??

但事实上,了解图像构成,或者学过GIMP图像处理,甚至PS的人看到这里就会明白一了。



就举那段话的2个例子大家就能明白了


由于图像的构成是分层次的(也就是上面说的梯级),所以:


二维图像由一行一行(第一级)构成,而每一行又一个一个点(第二级)构成


三维图像由一个一个名面(第一级)构成,每一个平面由一行一行(第二级)构成,每行由一个一个点(第级)构成


到这里,原因就呼之欲出了,Mat中的step[0]就是我们每一个第一级,在内存中占据的字节数量例如,二维图像中step[0]就是每一行(第一级)在矩阵内存中,占据的字节的数量。也就是说step[i]就是第i+1在矩阵内存中占据的字节的数量


而每一级的字节数是多少就必须体现在下一级的数量上


例如,二维图像中step[0](第一级)的大小与点的数量有关(第二级)。而每个点占据的大小,也就是step[M.dims − 1] 就成了关键了,它的大小是多少,这点我就下不了定论了,因为这点是我们自行定义的,我们可以定义不同的通道数,每个通道不同的字节数,然后 通道数×每个通道字节数 就得出step[M.dims − 1]



                                                                                                     --Jdps 2013.2.7