01_OpenCv之Mat类
一.构造函数
Mat(int rows, int cols, int type);
其中:
- rows:代表矩阵的行数
- cols:代表矩阵的列数
- type:代表类型,包括通道数及其数据类型,可以设置为CV_8UC(n)、CV_8SC(n)、CV_16SC(n)、CV_16UC(n)、CV_32SC(n)、CV_32FC(n)、CV_64FC(n),其中8U、8S、16S、16U、32S、32F、64F前面的数字代表Mat中每一个数值所占的bit数,所以32F就是占4字节的float类型,64F就是占8字节的double类型,32S是占4字节的int类型,8U是占1字节的uchar类型,其他的类似;C(n)代表通道数,当n=1时,即构造单通道矩阵或二维矩阵,当n>1时,即构造多通道矩阵或三维矩阵
Mat(Size(int cols, int rows), int type);
其中:
- Size的第一个参数代表矩阵的列数,第二个参数代表矩阵的行数
- type:代表类型,包括通道数及其数据类型
二.构造单通道Mat对象
以构造2行3列的矩阵为例:
-
通过矩阵的行、列构造Mat对象
Mat m = Mat(2, 3, CV_32FC(1));
-
借助Size对象构造Mat对象
Mat m = Mat(Size(3,2), CV_32FC(1));
-
使用Mat中的成员函数create完成Mat对象的构造
Mat m; m.create(2, 3, CV_32FC(1));
或者
Mat m; m.create(Size(3, 2), CV_32FC(1));
-
构造全0矩阵
Mat m = Mat::zeros(Size(3, 2), CV_32FC(1));
-
构造全1矩阵
Mat m = Mat::ones(2, 3, CV_32FC(1));
-
构造小型矩阵
Mat m = (Mat_<int>(2, 3) << 1,2,3,4,5,6);
三.获取单通道Mat的基本信息
以下面的3行2列的二维矩阵为例:
-
获取矩阵的行数和列数
Mat m = (Mat<int>(3,2) << 11,12,33,43,51,16); //矩阵的行数 int rows = m.rows; //矩阵的列数 int cols = m.cols;
-
使用成员函数Size()获取矩阵的尺寸
Mat m = (Mat<int>(3,2) << 11,12,33,43,51,16); Size size = m.size(); cout << "尺寸:" << size << endl; //输出结果为: "尺寸:[2x3]"
-
使用成员函数channels()得到矩阵的通道数
Mat m = (Mat<int>(3,2) << 11,12,33,43,51,16); cout << "通道数:" << m.channels() << endl; //输出结果为: "通道数:1"
-
通过成员函数total()获取矩阵的面积(行数乘以列数)
Mat m = (Mat<int>(3,2) << 11,12,33,43,51,16); cout << "面积:" << m.total() << endl; //输出结果为: "面积:6"
-
成员变量dims,即矩阵的维数,对于单通道Mat是一个二维矩阵,对于多通道Mat是一个三维矩阵
Mat m = (Mat<int>(3,2) << 11,12,33,43,51,16); cout << "维数:" << m.dims << endl; //输出结果为: "维数:2"
四.构造多通道Mat对象
构造一个n个通道,rows行,cols列的浮点型Mat对象,形式如下:
Mat(int rows, int cols, CV_32FC(n));
当n=1时,就变成了单通道Mat,比如构造一个2行2列的float类型的三通道矩阵:
Mat m = (Mat<Vec3f>(2, 2) << Vec3f(1,11,21), Vec3f(2,12,22), Vec3f(3,13,23), Vec3f(4,14,24));