Mat类学习
Opencv中的数据类型与我们常用的数据类型的一一对应关系:Mat_->CV_8U;Mat_->CV_8S;Mat_->CV_16S;Mat_->CV_16U;Mat_->CV_32S;Mat_->CV_32F;Mat_->CV_64F。
Mat类中depth与type属性的理解:depth是用来度量每一个像素中每一个通道的精度,但它本身与图像的通道数无关。depth数值越大,精度越高。type是矩阵的类型,包含矩阵中元素的类型以及通道数信息,type的命名格式为CV_(位数)+(数据类型)+(通道数)。
Mat类中data属性理解:uchar类型的指针,指向Mat数据矩阵的首地址。
Mat类中可以访问像素值的函数:1)ptr函数:该函数作用是可以访问任意一行像素的首地址,格式是image.ptr<数据类型,一般为uchar>(指定的行数);2)at函数:该函数作用是可以访问图像中的任意一个像素,格式有两种,单通道是image.at(i,j);三通道格式如下:蓝色通道:image.at(i,j)[0];绿色通道:image.at(i,j)[1];红色通道:image.at(i,j)[2]。
定义int数据类型的矩阵A,用at函数以double型进行访问矩阵A的元素,这是不可以的。定义double数据类型的矩阵A,用at函数以int型进行访问矩阵A的元素,这也是不可以的。因为在定义矩阵的时候,已经确定好了矩阵的元素类型,分配好了相应的矩阵内存,以另外的数据类型格式去访问的话,类型不匹配。如果要转换的话,需要在前面加上强制类型转换符。
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。
Mat类对图像内存的分配:一般来说,赋值运算符和拷贝构造函数(构造函数)只复制信息头,不复制整个矩阵,而使用函数clone()或者copyTo()是来复制一幅图像的矩阵。
Mat类定义对象常用的几种形式:
1.使用Mat()构造函数
常用的几种构造函数:1)Mat(int rows,int cols,int type);2)Mat(Size size,int type);3)Mat(int rows,int cols,int type,const Scalar& s);4)Mat(Size size,int type,const Scalar& s);
2.利用create()函数对Mat类进行初始化工作
举例:Mat B; B.Create(2,2,2,CV_8UC1);
3.利用Matlab式的初始化方式:zeros(),ones(),eye()
举例:
1)Mat E=Mat::eye(4,4,CV_64F);
2)Mat O=Mat:ones(2,2,CV_32F);
3)Mat Z=Mat::zeros(3,3,CV_8UC1);
4.对小矩阵使用逗号分隔式初始化函数
Mat C=(Mat_(3,3,)<<0,-1,0,-1,5,-1,0,-1,0);
5.为已存在的对象创建新信息头(使用成员函数clone()和copyTo()为一个已存在的Mat对象创建一个新的信息头)
Mat rowClone=C.row(1).clone();