Mat是OpenCV2.0以后引入的在电脑中表示图像的数据结构,不需要手动的为其开辟空间,而且也不需要在最后将其手动空间释放,非常的方便。Mat是一个类,由两部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等)和一个指向存储所有像素值的矩阵的指针。为了解决在函数中传递图像时带来的大的开销,每个Mat对象有自己的信息头,但共享一个矩阵,这通过让矩阵指针指向同一个地址实现,拷贝构造函数只是复制信息头和矩阵指针,并不复制矩阵。下面举例说明:
Mat A,C;//仅创建信息头部分
A = imread("1.jpg");//这里为矩阵开辟内存
Mat B(A);//使用拷贝构造函数
C = A;//赋值运算符
以上所有的Mat对象都最终指向同一个也是唯一一个数据矩阵。通过任何一个对象所做的改变会影响其他对象。
当想复制矩阵本身的时候,可以使用函数clone()或者copyTo()。
Mat F = A.clone();
Mat G;
A.copyTo(G);
这样改变F或者G不影响Mat信息头所指向的矩阵。
Mat不仅是一个非常有用的图像容器类,同时也是一个通用的矩阵类,我们可以用它来创建和操作多维数组。创建一个Mat对象有多种方法,列举一些比较常用的方法如下:
1、使用Mat构造函数:
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
这是一个二维的多通道图像,前面两个数字2代表的是图像的尺寸为2行2列&