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允许的任何数据类型。

posted @ 2023-04-07 17:59  夏蝉沐雪  阅读(52)  评论(0编辑  收藏  举报