opencv-Mat成员变量-step

初探step

       在一篇博文中对type、depth、step这三个成员变量有比较清晰的解释,阅读后对step这个成员仍然存在一些疑惑,因此将自己观察到的信息记录下来,方便后续回忆。

  • 疑惑1:step的用法?

第一次看到step,第一反应会是,是什么?怎么用?所以先介绍step这个变量怎么来用。

Mat  last_img= imread("D:\\pic-test\\img1.png", 1);
cout << last_img.step[0] << "  " << last_img.step[1] << "  " << last_img.step[2] << "  " << endl;

根据opencv的文档可知通常以step[i]的方式进行取值,因此这引出了第二个疑惑;

  • 疑惑2:step[0]、step[1]、step[2]代表了什么意思?

为了说明这个问题,疑惑2中图片和代码借用了“太平洋上的冰山”发布的博文中的图片和代码,因为博主给图片和代码非常典型且能说明问题,谢谢博主~

  1. 为了解释清楚疑惑2,我们需要先了解 step 是做什么用的?

上图清晰的表明了,step 是为了更好的帮助我们查找元素o(x,y,z)在矩阵M中的位置而设置的,借助step,我们可以快速定位元素o在M中的地址,从而通过访问地址的方式完成对元素的操作,来提高我们的编程效率。

  1. 搞清楚step的作用后,我们就可以去理解step[i]表示的是什么意思?
int dim[3]={3,3,3};
Mat src(3,dims,CV_16SC2,Scalar_<short>(1,2);

cout<<"step[0]:"<<src.step[0]<<endl;
cout<<"step[1]:"<<src.step[1]<<endl;
cout<<"step[2]:"<<src.step[2]<<endl;

以上面代码为例,Mat中存储的数据类型为:2通道16字节short类型,Mat为3*3*3的三维数组,那么:

step[0]=(3*3)*(16*2/8bit)=36byte;    //step[0]为面的大小

step[1]=3*(16*2/8bit)=12byte;               //step[1]为线的大小

step[2]=1*(16*2/8bit)=4byte;                 //step[2]为点的大小

当我们想获得元素(1,2,1)的地址时:addr=step[0]*1,step[1]*2+step[2]*1;

  • 疑惑3:  Mat对象由picture构造时,step怎么使用?

我们常见的图像(.jpg,.bmp等),在opencv中打开都属于二维图像,因此

step[0]=cols*channels;//一行元素所占size

step[1]=channels;//一个元素所占size

对(x,y)定位为:addr=step[0]*x+step[1]*y;

  • 疑惑4:step和step[1]之间的关系?

首先打印step和step[1]、step[2]的地址,发现,这三个地址之间相差8个单位;说明step和step[1]并不是同一个变量

打印step、step[1]的数值发现,这两个值相同,都为640*3=1920,说明step,step[1]代表的含义相同,至少在二维图像中,我们可以将step==step[1]。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值