Mat是一个类,由两个数据部分组成,分别是矩阵头和一个指向存储矩阵所有像素值的矩阵,其中矩阵头包含了矩阵尺寸,存储方法,存储地址等信息。
对于OpenCV1.X时代基于C语言构建的图像存储格式IplImage*,如果在退出之前忘记release就会造成内存泄漏。而在OpenCV2.0之后的版本,使用了Mat结构取而代之,OpenCV变得像MATLAB那样上手很方面。
关于Mat类:
(1)不必手动开辟空间
(2)不必在不再需要的时候立即释放掉
赋值运算符和拷贝构造函数只复制信息头,不是深拷贝。
Mat A ,C; //仅创建信息头部分
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR); //这里为矩阵开辟内存
Mat B(A); //使用拷贝构造函数
C = A; //赋值运算符
使用函数clone()或者copyTo()可以深拷贝。
Mat F = A.clone();
Mat G;
A.copyTo(G);
创建一个感兴趣区域只要创建包含边界信息的信息头。
Mat D(A,Rect(10,10,100,100));//使用矩形界定
Mat E = A(Range:all(),Range(1,3)); //使用行和列界定
创建Mat对象的七种方式:
- 使用Mat()构造函数
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
- 在C/C++中通过构造函数进行初始化
int sz[3] = {2,2,2}; Mat L(3,sz,CV_8UC3,Scalar::all(0));
上面的例子展示了如何创建一个超过二维的矩阵,第二参数传递了一个指向数组的指针,这个数组包含了每个维度的尺寸。
- 为已存在的IplImage指针创建信息头
- 利用Create()函数
M.Create(4,4,,CV_8UC(2));
- 采用Matlab的初始化方式:包括zeros(),ones(),eyes()。
Mat E = Mat::eye(4,4,CV_64F); //单位矩阵 Mat E = Mat::ones(4,4,CV_64F); Mat E = Mat::zeros(4,4,CV_64F);
- 对小矩阵使用逗号分隔式初始化函数
Mat C = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
- 为已存在的对象创建新的信息头
Mat RowClone = C.row(1).clone();