基础容器Mat
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。Mat使用引用计数机制,让每一个Mat对象有自己的信息头,但共享同一个矩阵。这通过让矩阵指针指向同一个地址实现。而拷贝构造函数则只复制信息头和矩阵指针,而不是复制矩阵。
显示创建Mat对象的六种方法
方法一
最常用的方法是直接使用Mat()构造函数。
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
M=
[0,0,255,0,0,255;
0,0,255,0,0,255;]
第一个参数是行数,第二个参数是列数;
第三个参数是数据类型:
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
CV_8UC3表示8位的unsigned char型,每个像素由三个元素组成三通道;
第四个参数是数值:在opencv中采取的是BGR的三色顺序,Scalar(B,G,R);
方法二
这种方法为在C\C++中通过构造函数进行初始化。
int sz[3]={2,2,2];
Mat L(3,sz,CV_8UC,Scalar::all(0));
这是一个三维数组。
第一个参数指定维数,第二个参数传递一个数组的指针,这个数组包含每个维度的大小;
第三个参数如上(8位的unsigned char型,每个像素由一个元素组成)
第四个参数如上(全设了0);
方法三
利用Mat类中的Create()成员函数进行Mat类的初始化操作。
Mat M;
M.create(4,4,CV_8UC3)
第一个参数是行数,第二个参数是列数;
第三个参数是数据类型如上;
方法四
采用Matlab形式的初始化方式:zeros(),ones(),eye()。
Mat A=Mat::zeros(4,4,CV_8UC3); 表示矩阵里的数值全设为0
Mat B=Mat::ones(4,4,CV_32F); 表示矩阵里的数值全设为1
Mat C=Mat::eye(4,4,CV_64F); 表示矩阵里的对角线数值都设为1,其余为0
方法五
对小矩阵使用矩阵逗号间隔式初始化函数
Mat M=(Mat_<uchar>(3,3) << 0,1,0,0,1,0,0,1,0);
M=
[0,1,0;
0,1,0;
0,1,0;]
(Mat_<type>(rows,cols) << vals);
方法六
使用成员函数clone()或者copyTo()为一个已存在的Mat对象创建一个新的信息头。
Mat src(4,4,CV_8UC3,Scalar(0,0,255));
Mat duplicate1=src.clone();
Mat duplicate2;
src.copyTo(duplicate2);