> 文章列表 > 【opencv】图像数字化——矩阵的运算( 5 乘法运算)

【opencv】图像数字化——矩阵的运算( 5 乘法运算)

【opencv】图像数字化——矩阵的运算( 5 乘法运算)

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;
}

在这里插入图片描述