Mat
概念
Mat:用于读取和保存图像以及其他矩阵数据,默认尺寸为0
Mat中包含许多构造函数,用来构造一个矩阵,这些矩阵就是我们处理图像的基本的操作对象,其中的属性包括行列类型等。
Mat由两个数据部分组成:矩阵头和一个指向存储所有像素值的矩阵。
数据头包括:矩阵尺寸,存储的方法,存储地址等)
由于矩阵中的像素值可能会很庞大,那么OpenCV就利用了信息头,拷贝和使用时,只改变信息头,并不把整个矩阵再拷贝一份。只拷贝信息头和指向矩阵数据的指针。
Mat会有计数机制,当最后一个头被释放,计数值为0,那么矩阵就会被清理。如果只是想拷贝矩阵本身(不仅仅是信息头和矩阵指针)就用Clone()或者copyTo()
用法
基本的构造
Mat(int rows, int cols, int type);
rows 矩阵行 cols列 type类型
类型例如CV_8UC1
CV_8UC3指的是:CV_ [每一项的位数][有无符号][类型前缀]C为字符型[通道数]
下面代码示例来理解一下type
Mat M1(3,2,CV_8UC1,Scalar(0,0,255));
Mat M2(3,2,CV_8UC2,Scalar(0,0,255));
Mat M3(3,2,CV_8UC3,Scalar(0,0,255));
cout << M1 << endl;
cout << M2 << endl;
cout << M3 << endl;
可以看到,同样都是三行两列,0,0,255,显示不同的通道,是不一样的,画红色为一个单元。
下面一幅图更好的理解通道:来源于 官方文档(这是一个三通道类型矩阵)
Size类构造
Mat(Size size, int type);
附带Scalar类构造
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s);
Mat(int ndims, const int* sizes, int type, const Scalar& s);
Mat(const std::vector<int>& sizes, int type, const Scalar& s);
使用create
可以使用create(),这样可以先定义Mat对象,然后再使用其带有的create函数
Mat M_without_parameter;
M_without_parameter.create(4,4,CV_8UC3);
cout << M_without_parameter << endl;
简易构造
Mat M_simple = (Mat_<double>(3,3) << 0, 7, 0, -1, 5, 4, 0, -1, 0);
cout << M_simple << endl;
其他
使用ndims ,建立几维矩阵
Mat(int ndims, const int* sizes, int type);
利用容器来构建,用容器来直接构建矩阵,可以直接用二维容器,也可以使用一个为行,另一个为每列的数组
Mat(const std::vector<int>& sizes, int type);
可以进行拷贝
Mat(const Mat& m);
这种拷贝方式,仅仅只是
将头和矩阵指针拷贝了,矩阵并没有增多。
附带初始数据构造
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
仅对Mat有初步了解 2022-4-4