Mat类支持的运算
Mat类的加减乘除
对图像进行滤波、增强等操作都需要对像素级别进行加减乘除
Mat a = (Mat_<int>(3,3) << 1,2,3,4,5,6,7,8,9);
Mat b = (Mat_<int>(3,3) << 1,2,3,4,5,6,7,8,9);
Mat c = (Mat_<double>(3,3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2);
Mat d = (Mat_<double>(3,3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2);
Mat e,f,g,h,i;
e = a + f;
f = c - d;
g = 2 * a;
h = d / 2.0;
i = a - 1;
两个Mat类变量进行加减乘除时,两个矩阵的数据类型要是相同的
常数与Mat类变量运算,保留Mat类数据类型,例如:double类型常数与int类型的Mat类变量运算,最后为int类型
两个Mat类矩阵的乘法运算
Mat j,m;
double k;
j = c*d; //矩阵运算
k = a.dot(b);
m = a.mul(b);
矩阵运算要求第一个Mat类矩阵的列数必须与第二个矩阵行数相同
Mat类中的数据类型必须为CV_32FC1、 CV_64FC1、 CV_32FC2、 CV_64FC2
示例:
[1,2,4 [1,2
2,0,3] * 3,4
0,5]
>> [1*1+2*3+4*0 1*2+2*4+4*5
2*1+0*3+3*0 2*2+0*4+3*5]
dot说明:
对两个Mat类矩阵执行点乘运算,就是把整个Mat矩阵扩展成一个行(列)向量,之后执行向量的点乘运算,对应位一一相乘之后求和的操作,点乘的结果是一个标量。
dot方法声明中显示返回值是double,所以a.dot(b)结果是一个double类型数据,不是Mat矩阵,不能把a.dot(b)结果赋值给Mat矩阵!
若参与dot运算的两个Mat矩阵是多通道的,则计算结果是所有通道单独计算各自.dot之后,再累计的和,结果仍是一个double类型数据
f = d1e1 + d2e2 + d3e3
mul说明:
mul操作不对参与运算的两个矩阵A、B有数据类型上的要求,但要求A,B类型一致,不然报错;
Mat AB=A.mul(B),若声明AB时没有定义AB的数据类型,则默认AB的数据类型跟A和B保存一致;
若AB精度不够,可能产生溢出,溢出的值被置为当前精度下的最大值;