opencv学习笔记——Mat属性与成员函数总结

 自己最近在看《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();

 

 

 

 

 

 

 

 


版权声明:本文为forever_and_forever原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。