爱悠闲 > OpenCV中Mat类的学习笔记

OpenCV中Mat类的学习笔记

分类: 语法  |  标签: opencv,c++,笔记  |  作者: zhupananhui 相关  |  发布日期 : 2014-09-15  |  热度 : 383°
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]。


同类文章:语法