一.原理
Mat类由两个数据部分,矩阵头和一个指向存储所有像素值的矩阵(根据所选存储方法不同,维数可以不同)的指针。
①数据部分
矩阵头
包含矩阵尺寸、存储方法、存储地址等信息
指针
②成员函数
二.使用
不必太过考虑内存分配/释放问题
①复制
不同的Mat对象共享一个矩阵
Mat A,C;
A = imread("test.png");
Mat B(A); //方式1
C=A; //方式2
//引用部分内容,创建一个ROI
Mat D(A, Rect(10,10,100,100)); //使用矩形界定范围
Mat E = A(Range:all(), Range(1,3)); //使用行列界定范围
复制矩阵内容
//这样可以使几个Mat的矩阵互不影响
//但是效率会降低,尤其是在大型图像处理中
Mat F = A.clone();
Mat G;
A.copyTo(G);
②创建对象
Mat()构造函数
Mat M(2, 2, CV_8UC3, Scalar(0,0,255));//参数为 行数,列数,存储类型以及每个矩阵点的通道数
cout << "M = " << endl << ' ' << M << endl;
第三个参数:CV_[位数][带符号与否][类型前缀]C[通道数]
这里通过<<
运算符来查看矩阵的实际值,注意Mat的<<
运算符只对二维矩阵有效
C/C++ style
创建一个超过两维的矩阵:
int sz[3]={2,2,2}; //指定维数,然后传递一个指向数组的指针,该数组包含每个维度的尺寸,后续两个参数与之前相同
Mat M(2,sz,CV_8UC,Scalar::all(0));
为已存在的IplImage
指针创建信息头
因为IplImage好像已经不用了,略
create()函数
Mat M;
M.create(4,4,CV_8UC(2));
cout << "M = " << endl << M << endl;
该方法不能为矩阵设初始值,只是重新开辟内存
Matlab style
eye()
对角线上元素全为1,其余元素全为0的矩阵
zeros()
全为0
ones()
全为1
Mat E = Mat::eye(4, 4, CV_64F);
Mat O = Mat::ones(2, 2, CV_32F);
Mat Z = Mat::zeros(3, 3, CV_8UC1);
小矩阵
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
为已存在Mat对象新建信息头
Mat RowClone = C.row(1).clone();
三.补充内容
①像素值存储方法
RGB
Red、Green、Blue(、Alpha)