1、A*B
CV_EXPORTS MatExpr operator * (const Mat& a, const Mat& b);
如A是m×n矩阵,B是n×p矩阵,它们的乘积AB是一个m×p矩阵。
如上图所示,C=AB。C中第i行第j列所在元素C(i,j)等于A中第i行所有元素跟B中第j列所有元素一一对应的乘积之和。
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat A = Mat::ones(2, 3, CV_32FC1);
Mat B = Mat::ones(3, 2, CV_32FC1);
Mat AB;
A.at<float>(0, 0) = 1;
A.at<float>(0, 1) = 2;
A.at<float>(0, 2) = 3;
A.at<float>(1, 0) = 4;
A.at<float>(1, 1) = 5;
A.at<float>(1, 2) = 6;
B.at<float>(0, 0) = 1;
B.at<float>(0, 1) = 2;
B.at<float>(1, 0) = 3;
B.at<float>(1, 1) = 4;
B.at<float>(2, 0) = 5;
B.at<float>(2, 1) = 6;
AB = A * B;
cout << "A=\n" << A << endl << endl;
cout << "B=\n" << B << endl << endl;
cout << "AB=\n" << AB << endl << endl;
system("pause");
}
2、A.dot(B)
double dot(InputArray m) const;
A.dot(B)操作相当于数学向量运算中的点乘,也叫向量的内积、数量积。
对于向量a和向量b:

a和b的点积公式为:

对两个向量对应位一相乘之后求和的操作,点乘的结果是一个标量。
dot方法声明中显示返回值是double,所以A.dot(B)结果是一个double类型数据,不是Mat矩阵,不能把A.dot(B)结果赋值给Mat矩阵!
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat A = Mat::ones(2, 3, CV_8UC1);
Mat B = Mat::ones(2, 3, CV_8UC1);
A.at<uchar>(0, 0) = 1;
A.at<uchar>(0, 1) = 2;
A.at<uchar>(0, 2) = 3;
A.at<uchar>(1, 0) = 4;
A.at<uchar>(1, 1) = 5;
A.at<uchar>(1, 2) = 6;
B.at<uchar>(0, 0) = 1;
B.at<uchar>(0, 1) = 2;
B.at<uchar>(0, 2) = 3;
B.at<uchar>(1, 0) = 4;
B.at<uchar>(1, 1) = 5;
B.at<uchar>(1, 2) = 6;
double AB = A.dot(B);
cout << "A=\n" << A << endl << endl;
cout << "B=\n" << B << endl << endl;
cout << "double类型的AB=\n" << AB << endl << endl;
system("pause");
}
3、A.mul(B)
MatExpr mul(InputArray m, double scale=1) const;
要求参与运算的矩阵A的行列和B的行列数一致。计算结果是跟A或B行列数一致的一个Mat矩阵。
2*2大小的Mat矩阵A和B:
对A和B执行mul运算:
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat A = Mat::ones(2, 3, CV_8UC1);
Mat B = Mat::ones(2, 3, CV_8UC1);
A.at<uchar>(0, 0) = 60;
A.at<uchar>(0, 1) = 2;
A.at<uchar>(0, 2) = 3;
A.at<uchar>(1, 0) = 4;
A.at<uchar>(1, 1) = 5;
A.at<uchar>(1, 2) = 6;
B.at<uchar>(0, 0) = 60;
B.at<uchar>(0, 1) = 2;
B.at<uchar>(0, 2) = 3;
B.at<uchar>(1, 0) = 4;
B.at<uchar>(1, 1) = 5;
B.at<uchar>(1, 2) = 6;
Mat AB = A.mul(B);
cout << "A=\n" << A << endl << endl;
cout << "B=\n" << B << endl << endl;
cout << "AB=\n" << AB << endl << endl;
system("pause");
}