Mat类变量支持的运算以及相关函数的掌握

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]

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神 匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值