5 乘法运算
5.1使用“*”运算符
- 对于Mat对象的乘法,两个Mat只能同时是float或者double类型,对于其它数据类型的矩阵乘法会报错
- src1的列数等于src2的行数
- m×n * n×p=m×p
#include <opencv2/core/core.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(){
Mat src1 = (Mat_<double>(2, 3) << 1, 2, 3, 4, 5, 6);
Mat src2 = (Mat_<double>(3, 2) << 6, 5, 4, 3, 2, 1);
Mat dst;
dst=src1*src2;
//dst = src1 / src2;
cout << src1 << endl;
cout << src2 << endl;
cout << dst << endl;
return 0;
}
- 双通道矩阵相乘,相当于复数
#include <opencv2/core/core.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(){
Mat src1 = (Mat_<Vec2f>(2, 1) << Vec2f(1, 2), Vec2f(3, 4));
Mat src2 = (Mat_<Vec2f>(1, 2) << Vec2f(10, 20), Vec2f(5, 15));
Mat dst=src1*src2;
cout << src1 << endl;
cout << src2 << endl;
cout << dst << endl;
return 0;
}
5.2使用gemm函数
void gemm(InputArray src1,InputArray src2,double alpha,InputArray src3,double beta,InputOutputArray dst,int flags=0)
- gemm:矩阵乘法
- src1:输入类型是CV_32F或者CV_64F的单/双通道矩阵
- src2 :输入矩阵,类型同src1
- alpha:src1与src2相乘后的系数
- src3:输入矩阵,类型与src1相同
- beta:src3的系数
- dst:输出矩阵
- flags:控制 src1、 src2、 src3是否转置来实现矩阵之间不同的运算
- 0:没有转置;
- CV_GEMM_A_T:表示src1转置;
- CV_GEMM_B_T:表示src2转置;
- CV_GEMM_C_T:表示src3转置;
- 也可以:CV_GEMM_A_T+CV_GEMM_C_T;
- gemm只接受CV_32FC1、CV_64FC1、CV_32FC2、CV_64FC2数据类型的Mat
#include <opencv2/core/core.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(){
Mat src1 = (Mat_<double>(2, 3) << 1,2,3,4,5,6);
Mat src2 = (Mat_<double>(3, 2) << 6,5,4,3,2,1);
Mat dst;
gemm(src1, src2, 1, NULL, 0, dst, 0);
cout << src1 << endl;
cout << src2 << endl;
cout << dst << endl;
return 0;
}