自己最近在看《opencv2 计算机视觉编程手册》学习了不少相关知识,这篇博文主要总结了己在学习过程中所遇到的Mat类的相关属性和成员函数,因为在学习过程中发觉关于Mat类属性与成员函数内容挺多而且特别容易混淆,所以把这些内容总结在这篇博文上。
cols , rows (属性)
顾名思义 rows 返回图像矩阵的行数,cols返回列数。
step (属性)
step以字节为单位的图像宽度。
Mat demo(3, 3, CV_32FC3);
cout << demo.step << endl; //输出 36 = 3 * 4 * 3
elemSize() (函数)
返回每一个像素点的字节数,比如三通道的short(两字节)型的矩阵(CV_16C3) elemSize()将返回 6 。
会发现 step = elemSize() * cols
total() (函数)
返回总的像素点数,也就是 cols*rows
- depth() (函数)
depth函数返回每个像素点的数据类型。Mat.depth()得到的是一个0~6的数字,分别代表不同的数据类型,对应关系如下:
enum{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6}
其中U是unsigned的意思,S表示signed,也就是有符号和无符号数。值得注意的是对于彩色图像每一个实际像素点是由BGR(实际在内存里的位置blue在前面,green在中间,red在后面)三个亚像素点构成,这里的depth() 返回的是每个亚像素点的数据类型。
- Mat.type() (函数)
返回值在 Mat.depth()的值上加上某个数值,单通道叫0 双通道加8 三通道加16
- clone()
拷贝一幅图像,这里的拷贝不是指只拷贝头信息然后依然共享矩阵数据,而是深拷贝。
- create() (函数)
说到clone() 就不得不提create() 函数,两者都可以深度拷贝一幅图像但略有差别。
对于一个已经存在的Mat矩阵我们想根据新的尺寸和数据类型对这个矩阵进行重新分配,那么我们就可以调用create成员函数。而且,如果新指定的尺寸和数据类型与原有一样,create函数会直接返回,并不会对本实例做任何更改。
result.create(image.rows,image.cols,image.type());
result.create(image.size(),image.type());
- data (属性)
图像数据是以unsigned char 形式保存在一块内存中。这块内存的首地址可以通过data成员变量获得。
uchar* data = image.data;
从当前行到下一行可以通过对指针加上行宽完成
data += image.step; //下一行
也可以通过如下方式获得第 j 行、i 列的像素地址:
data = image.data + j*image.stap + i*image.elemSize();