>step简介
OpenCV中使用Mat类是一个N维的数组对象,用于装载图像数据,对二维图像来说就是一个二维数组。Mat对象有cols、rows、step、size、data、dims等属性,其中的step是个数组,用于存储每一维元素的大小(单位字节),如step[0]就是一维元素的个数,具体到图像来说,step[0]就是图像每行像素占用的字节数,step[1]就是每列像素占用的字节数。
>问题
最近笔者在研究图像CLAHE算法,发现可以将数组step转换为一个整数输出,按理说这种转换应该输出数组的内存地址,但实际输出的确实step的第一个元素。
具体来看如下代码:
- #include
- #include
- #include
-
- int main(int argc, char* argv[])
- {
- //从文件中读入图像
- if (argc != 2)
- {
- printf("程序必须带一个图像文件名参数!");
- return -1;
- }
- Mat img = imread(argv[1]);
- if (!img.data)
- {
- printf("加载图像文件没有成功,请确认图像文件 %s 是否存在!", argv[1]);
- return -1;
- }
- printf("图像的分辨率为:%d×%d
", img.cols, img.rows);
- printf("step =%X,stepCast =%d,step[0]=%d,step[1]=%d
", img.step, static_cast<int>(img.step), img.step[0], img.step[1]);
- return 0;
- }
运行后输出信息如下:
- 图像的分辨率为:1023×681
- step =28FC40,stepCast =3069,step[0]=3069,step[1]=3
可以看到stepCast 的输出值与step[0]一样,都是图像的宽度×像素占用字节数(由于这里是彩色图像,像素占用了3个字节)。
想了半天没想明白,也用其他自定义数组进行了测试,发现根本无法进行这种转换,直接编译报错,请各位大佬指教。
>小结
本文介绍了关于OpenCV图像mat矩阵step属性的含义、使用案例,最后针对相关使用抛出了一个疑问。
》》》修订 说明
本文的问题咨询了老猿大哥,他给予了指导。按照老猿的介绍,笔者关于step的理解存在一些谬误,他已经单独撰文介绍,我就不更正了,在此附上老猿大哥该文的链接:
OpenCV源代码赏析: Mat对象step属性含义及使用深入分析http://iyenn.com/rec/324943.html
看了该文让不禁让人对阅读OpenCV源码产生了浓厚的兴趣。
评论记录:
回复评论: