OpenCV中Mat类的学习笔记

Mat是OpenCV中常用的C++类,用来存储矩阵数据,它的部分成员:data,rows,cols,step,size。
(1)step是一个结构体实例,并定义了[]运算符重载,并且运算符重载函数返回的是引用类型,step[i] 就相当于step.p[i],即step[i]是可读可写的,而且step.p和step.buf是指向同一地址单元的指针,不同的是step.p是一个指针,而step.buf是一个数组名。
(2)step[1] 相当于step.p[1],存储矩阵每个元素所占的字节数(二维矩阵);step[0] 相当于step.p[0],存储step.p[1]*cols,即矩阵每行所占的字节数(二维矩阵)则m[i,j](矩阵m的第i行第j列元素,OpenCV并没有这种形式的访问,这里是用来示意)的地址为:addr(m[i][j]) = m.data + i*m.step[0] + j*m.step[1];需要注意的是m.data是一个uchar*型指针,如果矩阵数据是其他类型要做指针类型的强制转换才能正确访问矩阵的元素,如修改int型矩阵m的元素m[i,j];      *((int*)(m.data+i*m.step[0]+j*m.step[1])) = 100;
(3)Mat的构造函数Mat(int rows, int clos,int type)中,其中当矩阵是2维的时候对rows,cols的赋值是通过size.p来完成的,在Mat类的实例中,rows和cols数据成员存储在相邻的内存单元中,先用m.size.p = &m.rows,得到rows数据成员
的地址并赋给size.p,然后用m.size.p[i] = s;s被分两次赋值rows,cols(构造函数传来的值),这个构造函数在代码上看不出给rows,cols成员赋值(即找不到类似“m.rows = _rows, m.cols =_cols ”的语句),但实际已经通过rows的地址给rows和cols所在的内存单元赋值了,具体有如下等式:
m.size == m.size.p == &m.rows
m.rows == m.size[0] == m.size.p[0]
m.cols == m.size[1] == m.size.p[1]
(4)step[0]是一个unsigned int型数据,存储的是矩阵每行所占的字节数,它的值和step.p[0],step.buf[0]相等,但实际编程中你会发现下面的等式:
m.step == m.step[0] == m.step.p[0] == m.step.buf[0]
step是Mat类的一个数据成员,也是一个结构体的实体,那么为什么可以在程序中像访问unsigned int型数据一样的去访问一个结构体的实例呢?这是因为Mstep类中有一个强制类型转换运算符重载函数,函数原型如下:inline Mat::MStep::operator size_t() const;这个函数定义了将类MStep的实例(隐式或显式)转换成 size_t()型时所采用的方法,也就是说当程序像访问size_t()型数据一样访问类MStep的实例时,程序会怎么处理,关于这种用法参见关于operator int()。在OpenCV的源程序中可以看到,这个强制类型转换运算符重载函数返回的是buf[0],这就解释了语句cout<<m.step<<endl;是合法的,而且值等于step[0]。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值