创建Mat类
Mat类是opencv中表示图像的常用数据类型,其包括头部和数据部分,头部存储Mat的长、宽、通道数等信息,数据部分存放每个点的像素值。
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
//初步创建Mat对象
Mat a(3, 3, CV_8UC1);
Mat b(Size(3, 3), CV_8UC1);
//CV_8UC1表示创建单通道的图像, CV_8UC2表示创建两通道的图像
// Scalar表示B,G,R三个通道的颜色
Mat c1(3, 3, CV_8UC1, Scalar(4, 5, 6));
Mat c2(3, 3, CV_8UC2, Scalar(4, 5, 6));
Mat c3(3, 3, CV_8UC3, Scalar(4, 5, 6));
//以枚举形式复制的矩阵
Mat d = (Mat_<int>(1, 5) << 1, 2, 3, 4,5);
//创建对角阵,且参数必须是1*n的矩阵
Mat e = Mat::diag(d);
//做抠图
Mat f = Mat(e, Range(2, 4), Range(2, 4));
cout << a << endl;
cout << b << endl;
cout << c1 << endl;
cout << c2 << endl;
cout << c3 << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
return 0;
}
返回结果:
[205, 205, 205;
205, 205, 205;
205, 205, 205]
[205, 205, 205;
205, 205, 205;
205, 205, 205]
//单通道矩阵
[ 4, 4, 4;
4, 4, 4;
4, 4, 4]
//双通道,所以只选择了前面两个数
[ 4, 5, 4, 5, 4, 5;
4, 5, 4, 5, 4, 5;
4, 5, 4, 5, 4, 5]
//三通道图像
[ 4, 5, 6, 4, 5, 6, 4, 5, 6;
4, 5, 6, 4, 5, 6, 4, 5, 6;
4, 5, 6, 4, 5, 6, 4, 5, 6]
[1, 2, 3, 4, 5]
//生成的对角阵
[1, 0, 0, 0, 0;
0, 2, 0, 0, 0;
0, 0, 3, 0, 0;
0, 0, 0, 4, 0;
0, 0, 0, 0, 5]
[3, 0;
0, 4]
Mat类的读取
Mat类中常用的属性包括
- rows----获得行数
- cols-----获得列数
- elemSize----获得每个元素的字节数
- channels-----获得通道数
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
//CV_8UC1表示创建单通道的图像, CV_8UC2表示创建两通道的图像
Mat c1(3, 3, CV_8UC1, Scalar(4, 5, 6));
Mat c2(3, 3, CV_8UC2, Scalar(4, 5, 6));
Mat c3(3, 3, CV_8UC3, Scalar(4, 5, 6));
//以枚举形式复制的矩阵
Mat d = (Mat_<int>(1, 5) << 1, 2, 3, 4,5);
//单通道的读取
cout << d.at<int>(0, 0) << endl;
//多通道的读取Vec2b,Vec3b---存放uchar类型,Vec2i,Vec3i--存放int类型
Vec2b vc = c2.at<Vec2b>(0, 1);
cout << vc << endl;
cout << (int)vc[0] << endl;
return 0;
运行结果:
1
[4, 5]
4
Mat类的运算
Mat符号运算:矩阵加减乘除,数乘等
Mat相关函数:
- absdiff()----两个矩阵对应元素差的绝对值
- add()--------两个矩阵求和
- addWeighted()-----两个矩阵线性求和
- divide()-------矩阵除法
- invert()--------矩阵求逆
- log()-----------矩阵求对数
- min()-----------两个矩阵计算最大值最小资
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
//以枚举形式赋值的矩阵
Mat a = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5,6,7,8,9);
Mat b = (Mat_<int>(3, 3) << 1, 2, 3, 7,8,9,4,5,6);
Mat c = (Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.3, 5.1,6.2,7.4,8.8,9.1);
Mat d = (Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.3, 5.1, 6.2, 7.4, 8.8, 9.1);
cout << "两个矩阵相加为:" << endl;
cout<< a + b << endl;
cout << "两个矩阵相减为:" << endl;
cout << c - d << endl;
cout << "矩阵数乘为:" << endl;
cout << 2 * a << endl;
cout << "矩阵数除为:" << endl;
cout << d /2.0 << endl;
cout << "矩阵数减为:" << endl;
cout << a-2 << endl;
cout << "两个矩阵相乘为:" << endl;
cout << c * d << endl;
cout << "两个矩阵内积为:" << endl;
cout <<a.dot(b) << endl;
cout << "两个矩阵对应位相乘为:" << endl;
cout << a.mul(b) << endl;
cout << "两个矩阵最小值为:" << endl;
cout << min(a,b) << endl;
return 0;
}
结果展示:
两个矩阵相加为:
[2, 4, 6;
11, 13, 15;
11, 13, 15]
两个矩阵相减为:
[0, 0, 0;
0, 0, 0;
0, 0, 0]
矩阵数乘为:
[2, 4, 6;
8, 10, 12;
14, 16, 18]
矩阵数除为:
[0.5, 1.05, 1.6;
2.15, 2.55, 3.1;
3.7, 4.4, 4.55]
矩阵数减为:
[-1, 0, 1;
2, 3, 4;
5, 6, 7]
两个矩阵相乘为:
[33.71, 40.97, 45.34;
72.11, 89.60000000000001, 101.8;
112.58, 140.5, 161.05]
两个矩阵内积为:
258
两个矩阵对应位相乘为:
[1, 4, 9;
28, 40, 54;
28, 40, 54]
两个矩阵最小值为:
[1, 2, 3;
4, 5, 6;
4, 5, 6]