openCV学习笔记(6):Mat类/数据结构详解(1)

Mat类不仅可以用于图像存储,同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵,以后将会更新将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对象

有多种方法创建一个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()函数无法设置图像像素的初始值。

你可能感兴趣的:(opencv,mat)