Mat类不仅可以用于图像存储,同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵,以后将会更新将Mat作为矩阵类的学习笔记。本文重点在于重新学习Mat类的结构,主要是重要成员变量和构造函数。
Mat类中关键属性如下所示:
//Mat类 class CV_EXPORTS Mat { public: //一系列函数 /* 包括几位字段: -Mat的标识 -连续性标志 -深度(位深) -通道数 */ int flags; //矩阵的维数,取值> = 2 int dims ; //矩阵的行数和列数,如果矩阵超过2维,变量值rows = -1,cols = -1 int rows,cols; //指向数据的指针 uchar *data ; //指针的引用计数器; //阵列指向用户分配的数据时,当指针为 NULL int * refcount ; //其他成员 };
有多种方法创建一个Mat对象。
2.1常用构造函数
//无参数构造函数 Mat::Mat(); //创建行数为rows,列数为cols,类型为type的图像 //type 可以是CV_8UC1,CV_16SC1,…, CV_64FC4 等。里面的8U 表示8 位无符号整数,16S 表示16 位有符号整数,64F表示64 位浮点数(即double 类型) //C 后面的数表示通道数,例如C1表示一个通道的图像,C4 表示4 个通道的图像,以此类推。如果你需要更多的通道数,需要用宏C//V_8UC(n),例如: // Mat M(3,2, CV_8UC(5));//创建行数为3,列数为2,通道数为5 的图像 Mat::Mat(int rows,int cols,int type); //创建大小为size,类型为type的图像 Mat::Mat(Size size, int type); //创建行数为rows,列数为cols,类型为type的图像,并将所有元素初始化为s Mat::Mat(int rows, int cols, int type,const Scalar& s); //创建大小为size,类型为type的图像,并将所有元素初始化为s Mat::Mat(Size size, int type, constScalar& s); //将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据 Mat::Mat(const Mat& m); //创建行数为rows,列数为col,类型为type 的图像,此构造函数不创建图像数据所需内存,而是直接使用data 所指内存,图像的行步长由step指定。 Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP); //创建大小为size,类型为type 的图像,此构造函数不创建图像数据所需内存,而是直接使用data 所指内存,图像的行步长由step 指定。 Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP); //创建的新图像为 m 的一部分,具体的范围由 rowRange 和 colRange指 定,此构造函数也不进行图像数据的复制操作,新图像与m 共用图像数据; Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange); //创建的新图像为m 的一部分,具体的范围roi 指定,此构造函数也不进行图像数据的复制操作,新图像与m 共用图像数据。 Mat::Mat(const Mat& m, const Rect& roi);
2.2 create方法
如果 create()函数指定的参数与图像之前的参数相同,则不进行实质的内存申请操作;如果参数不同,则减少原始数据内存的索引,并重新申请内存。使用方法如下面例程所示:
Mat M(2,2, CV_8UC3);//构造函数创建图像 M.create(3,2, CV_8UC2);//释放内存重新创建图像需要注意的时,使用create()函数无法设置图像像素的初始值。