【opencv入门教程】14. 矩阵乘除运算
文章选自:
一、函数multiply、divide
//乘法
CV_EXPORTS_W void multiply(InputArray src1, InputArray src2,
OutputArray dst, double scale = 1, int dtype = -1);
@brief 计算两个数组的每个元素的按比例缩放乘积
@note 当输出数组的深度为 CV_32S 时,不会应用饱和操作。在溢出的情况下,甚至可能得到带有错误符号的结果。
@param src1 第一个输入数组。
@param src2 第二个与 src1 大小和类型相同的输入数组。
@param dst 与 src1 相同大小和类型的输出数组。
@param scale 可选的缩放因子。
@param dtype 输出数组的可选深度。
//除法
CV_EXPORTS_W void divide(InputArray src1, InputArray src2, OutputArray dst,
double scale = 1, int dtype = -1);
CV_EXPORTS_W void divide(double scale, InputArray src2,
OutputArray dst, int dtype = -1
@brief 对两个数组或标量与数组进行每元素除法运算。
@note 当输出数组的深度为 CV_32S 时,不会应用饱和操作。在溢出的情况下,甚至可能得到带有错误符号的结果。
@param src1 第一个输入数组。
@param src2 第二个与 src1 大小和类型相同的输入数组。
@param scale 标量因子。
@param dst 与 src2 相同大小和类型的输出数组。
@param dtype 输出数组的可选深度;如果为 -1,则 dst 的深度将为 src2.depth(),但在数组与数组除法时,只能在 src1.depth()==src2.depth() 时传入 -1。
@sa multiply, add, subtract
二、测试程序
void Samples::MatrixMultiandDiv()
{
//step1. 矩阵之间乘法
cout << "step1. 矩阵乘法" << endl;
cv::Mat A1 = (cv::Mat_<float>(2, 3) << 1, 200, 3, 4, 5, 6);
cout << "A1中的数据为:\n" << A1 << endl << endl;
cv::Mat B1(A1.size(), A1.type(), cv::Scalar(1));
cout << "B1中的数据为:\n" << B1 << endl << endl;
double scale1 = 1.4;
cv::Mat C1;
cv::multiply(A1, B1, C1, scale1);
cout << "C1中的数据为:\n" << C1 << endl << endl;
cv::Mat D1;
cv::multiply(A1, B1, D1, scale1, CV_8U);
cout << "D1中的数据为:\n" << D1 << endl << endl;
//step2. 矩阵与标量相乘
cout << "step2. 矩阵与标量相乘" << endl;
cv::Mat A2 = (cv::Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
cout << "A2中的数据为:\n" << A2 << endl << endl;
double scale2 = 1.4;
cv::Mat B2 = scale2 * A2;
cout << "B2中的数据为:\n" << B2 << endl << endl;
//step3. 矩阵间相除
cout << "step3. 矩阵间相除" << endl;
cv::Mat A3 = (cv::Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
cout << "A3中的数据为:\n" << A3 << endl << endl;
cv::Mat B3 = (cv::Mat_<float>(2, 3) << 2, 3, 4, 5, 6, 7);
cout << "B3中的数据为:\n" << B3 << endl << endl;
cv::Mat C3;
double scale3 = 2;
cv::divide(B3, A3, C3, scale3);
cout << "C3中的数据为:\n" << C3 << endl << endl;
cv::Mat C31 = B3.mul(scale3 / A3);
cout << "C31中的数据为:\n" << C31 << endl << endl;
}