8.Mat类支持的运算
在进行数据处理时需要对数据进行加减乘除运算,Mat类变量支持矩阵的加减乘除运算,代码清单如2-17
代码清单2-17 Mat类的加减法运算 cv::Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); cv::Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); cv::Mat c = (cv::Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2); cv::Mat d = (cv::Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2); cv::Mat e, f, g, h, i; e = a + b; f = c - d; g = 2 * a; h = d / 2.0; i = a – 1;
需要注意的是,当两个Mat类变量加减运算时必须保证数据类型相同。进行乘除法运算时结果保留与Mat类型相同的数据类型,例如:double类型的常数与int类型的Mat类运算结果仍是int类型。
在对图像进行卷积运算时,需要两个矩阵进行乘法运算,OpenCV不仅提供了两个Mat类矩阵的乘法运算,而且定义了两个矩阵的内积和对应位的乘法运算,代码清单如2-18.
代码清单2-18 两个Mat类矩阵的乘法运算 cv::Mat j, m; double k; j = c*d; k = a.dot(b); m = a.mul(b);
"*"运算符表示两个矩阵的数学乘积,例如在A3*3 * B3*3 = C中,C中的每一个元素符合:Cij = Ai1B1i + Ai2B2i + Ai3B3i ,第一个矩阵的列数必须与第二个矩阵的行数相同,数据类型必须是CV_32FC1,CV_64FC1,CV_32FC2,CV_64FC2中的一种;
dot()表示矩阵内积,它会将矩阵拓展成一个行向量一个列向量,对应位置相乘相加:f = d1e1 + d2e2 + d3e3,.dot()运算的结果是double类型;
mul()的运算是对应位置相乘:Cij = AijBij,数据类型可以是Mat允许的任何数据类型。