Mat类 (Matrix的缩写) 是OpenCV用于处理图像而引入的一个封装类。在当前的OpenCV开发中,Mat可以说是最最最常见的数据单元,基本覆盖计算机视觉对于图像处理的基本要求。
默认构造函数Mat()
生成一个OpenCV提供函数的矩阵来分配储存空间。
Mat类可以分为两个部分:矩阵头和指向像素数据的矩阵指针。矩阵头包括数字图像的矩阵尺寸、存储方法、存储地址和引用次数等,矩阵头的大小是一个常数,不会随着图像的大小而改变,但保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量比矩阵头大几个数量级。由此可见,在图像进行复制和传递的过程中,主要的开销是由存放图像像素的矩阵而引起的,故而只是复制矩阵头和指向像素矩阵的指针。因此,在创建Mat类时也可以先创建矩阵头后赋值数据。
cv::Mat a; // 默认构造函数,创建矩阵头a
a = cv::imread("test.jpg"); // 向a中赋值图像数据,矩阵指针指向像素数据
cv::Mat b = a; // 复制矩阵头a,并命名为b
a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,其中任何一个矩阵头中修改了矩阵数据都会影响另外一个。但是当删除a变量时,b变量并不会指向一个空数据,只有当两个变量都删除后,才会释放矩阵数据。因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据。
Mat(int rows,int cols,int type)
重载的构造函数,这也是常用构造函数之一,在创建对象同时,提供矩阵的行数、列数以及存储类型。
Mat src(10, 10, CV_32FC3);
表示src是一个10*10的矩阵,且矩阵元素以3通道32位float型存储
Mat(Size size,int type)
Size类等效于一个成对数据,size::Size(cols,rows),特别注意 cols和rows的位置。
Mat src1(3, 4, CV_32FC3);
Mat src2(Size(3, 4), CV_32FC3);
src1表示3行4列3通道32位float型,src2则表示4行3列3通道32位float型。我们平时所说分辨率,也是Size的类型,比如屏幕分别率 1440*900,其中cols=1440,rows=900。
Mat(int rows,int cols,int type,const Scalar &s)
该构造函数与使用了Scalar参数,作用是能够通过Scalar数据类来初始化元素值。
Mat src1(300, 400, CV_8UC3, Scalar(255,255,255));
(255, 255, 255) 对应以8位无符号数存储,RGB色域的白色值,即生成一张白色背景的图片。
Mat(Size size,int type,const Scalar &s)
Mat(int ndims,const int *sizes,int type)
Mat(int ndims,const int *sizes,int type,const Scalar &s)
Mat clone()
:矩阵复制Mat image1 = imread("test.jpg",IMREAD_COLOR);
Mat image2 = image1;
Mat image3 = image1.clone();
image2得到的是image1的一个引用,即image2实际上指向的是image1的内存单元,当image1提前被释放掉的时候,image2访问无效。而image3不受限于image1的状态,可以自由操作。
void copyTo(Mat m)
从矩阵复制数据单元,从m矩阵复制数据单元,与clone函数的作用类似,使用形式不同
Mat image1 = imread("test.jpg",IMREAD_COLOR);
Mat image2;
image1.copyTo(image2);
image2和image1具有同样的数据内容且也不受限于image1的状态。
void convertTo(Mat m, int rtype, alpha, beta)
转换矩阵存储类型,m是输入矩阵,rtype是目标类型,alpha是放缩系数,beta是增减标量。
Mat image = imread("test.jpg",IMREAD_COLOR);
image.convertTo(CV_32FC3);
表示转换成32位浮点型。
void creat(int rows, int cols, int type)
:分配矩阵的存储单元,一般和默认构造函数配合使用。Mat diag()
:提取矩阵的对角元素。int channels()
:返回图像的通道数。int depth()
:返回图像深度,即矩阵元素的存储方式。mul(Mat m)
:矩阵的乘法。#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src;
src = imread("C:/Users/覃忠原/Desktop/OpenCV图片/test.jpg");
if (src.empty()) {
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//生成一张纯色图片
Mat dst;
dst = Mat(src.size(), src.type());
dst = Scalar(127, 0, 255);
namedWindow("input", WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}