1、四则运算
1-1、运算符号:直接利用数学符号表示矩阵的运算
e=a+b;
f=c-d;
g=2*a;
h=d/2.0;
i=a-1;
注意:我们在对两个Mat类进行加减法运算的时候,不仅通道数要一样、数据类型一样、里边的数据量也需要一样的。而对于Mat类与一个常数进行符号运算,相当于把Mat中的每个元素都做了对应的运算。
1-2、两个矩阵相乘
矩阵乘积---"*": cij=ai1b1j+ai2b2j+ai3b3j
这个矩阵相乘就是完全符合数学中的运算。
注意:3X3的矩阵只能与3X3的矩阵相乘,不能与4x3的矩阵相乘。但是4x3的矩阵与3x3的矩阵相乘是可以的。
向量内积---".dot": f=d1e1+d2e2+d3e3
其实这个就是点儿乘。用法a.dot(b);
注意:两个Mat矩阵相乘需要两个矩阵有相同的元素长度,我并不关心这两个矩阵的维度。
比如2*3与1*6相乘是可以的。矩阵的内积得到的是一个数值,而不是一个矩阵。
两个Mat类内积相乘也是必须保证两个Mat类内部的数据类型相同。
对应位元素乘积---".mul()": cij=aijbij
这个其实2x2的矩阵.mul()一个2x2的矩阵,得到的第3个矩阵就是结果,其结果是对应的每个
元素相乘的结果,写到对应的行列位置上。
注意:要求两个矩阵的维度相同、数据类型相同
2、openCV为Mat类提供的运算函数:(都可以从官网上查到相关的函数,我们这里举例几个典型的函数)
函数名: 作用:
absdiff() 两个矩阵对应元素差的绝对值
add() 两个矩阵求和
addWeighted() 两个矩阵线性求和
divide() 矩阵除法
invert() 矩阵求逆
log() 矩阵求对数
max()/min() 两个矩阵计算最大值/最小值
这些都是在官网上可以查看的。
3、如何查看OpenCV中提供的库函数?
在官网的对应的版本下-》Docs -》右上角的放大镜 -》输入Mat -》我们选择Mat -》cv::Mat 我们可以看到Mat类的继承图谱,下边还有Mat类中的类方法函数,这些函数的字面意思都很好理解。
4、Mat类矩阵的运算代码实战:
#include<iostream>
#include<opencv2/opencv.hpp>//使用这个大的头文件可以将所有的opencv的头文件全都包含进去
using namespace std;
using namespace cv;
int main()
{
system("color F0"); //将C++黑色的界面调节成白色
Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);//利用枚举法创建一个单通
//道的Mat
Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 7, 8, 9, 4, 5, 6);//与a变量局部互换
Mat c = (cv::Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8);
Mat d = (cv::Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8);
cout << "两个矩阵的和a+b=" << endl << a + b << endl;//应该得到的是每个元素互相加的新
//的矩阵
cout << "两个矩阵的差c-d=" << endl << c - d << endl;//因为两个矩阵完全相同,所以应该
//得到的是一个零矩阵
cout << "矩阵数乘2*a=" << endl << 2 * a << endl;
cout << "矩阵数除d/2.0=" << endl << d / 2.0 << endl;
cout << "矩阵减常数a-1=" << endl << a - 1 << endl;
cout << "两个矩阵相乘c*d=" << endl << c * d << endl;//得到的是一个矩阵
cout << "矩阵内积a .dot(b)=" << endl << a.dot(b) << endl;//内积得到的是一个数值
cout << "矩阵对应位相乘a .mul(b)=" << endl << a.mul(b) << endl;//第一位乘以第二个矩
//阵的第一位,第二位乘以第二个矩阵的第二位
cout << "两个矩阵最小值min(a,b)=" << endl << min(a, b) << endl;//得到的是两个矩阵中
//的每一位的最小值,这里的一个位不是一个通道的意思,如果是3通道的话 3个数是一个元素,
也就是说三个数是一个位。
return 0;
}
运行结果:
两个矩阵的和a+b=
[2, 4, 6;
11, 13, 15;
11, 13, 15]
两个矩阵的差c-d=
[0, 0, 0;
0, 0, 0;
0, 0, 0]
矩阵数乘2*a=
[2, 4, 6;
8, 10, 12;
14, 16, 18]
矩阵数除d/2.0=
[0.5, 1.05, 1.6;
2.15, 2.7, 3.25;
3.8, 4.35, 4.9]
矩阵减常数a-1=
[0, 1, 2;
3, 4, 5;
6, 7, 8]
两个矩阵相乘c*d=
[34.35, 41.28, 48.21000000000001;
76.92, 94.74000000000001, 112.56;
119.49, 148.2, 176.91]
矩阵内积a .dot(b)=
258
矩阵对应位相乘a .mul(b)=
[1, 4, 9;
28, 40, 54;
28, 40, 54]
两个矩阵最小值min(a,b)=
[1, 2, 3;
4, 5, 6;
4, 5, 6]