函数原型
void divide(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1); void divide(double scale, InputArray src2, OutputArray dst, int dtype = -1);
参数说明
divide有两个重载函数,主要介绍第一个。第一个是scale*X/Y,第二个是scale/Y,其中sacle是常数。
1.InputArray类型的src1,输入的第一幅图像。
.2.InputArray类型的src2,输入的第二幅图像。
3.OutputArray类型的dst,除法运算后的结果。
4.double类型的scale,常数因子。
5.int类型的dtype,控制输出图像的类型,如果src1和src2类型一致,该值就是-1;如果不一致,该值就对应图像类型,比如当值为0的时候,输出的结果就是CV_8U,值为5的时候,输出的结果就是CV_32F。
测试代码
#include <iostream> #include <opencv.hpp> using namespace std; using namespace cv; int main() { // 随机生成一个矩阵 cv::Mat src(10, 10, CV_32FC1); for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { src.at<float>(i, j) = rand() % 255; } } Mat other1 = Mat::zeros(10, 10, CV_32FC1); Mat other2 = Mat::ones(10, 10, CV_8UC1); other1.at<float>(2, 2) = 10; other2.at<uchar>(2, 2) = 10; Mat result1,result2; divide(src, other1, result1); divide(src, other2, result2,0.1,5); system("pause"); return 0; }
测试效果
图1 src数据
图2 other1数据
图3 第一次除法结果
图4 other2数据
图5 第二次除法结果
测试代码中,随机生成10*10的数据矩阵src,用全零矩阵other1先进行除法,设置第二行第二列的值为10,第一次除法运算后,结果只有第二行第二列的点完成了除法,其他全是零值,这是因为函数说明中提到过,除以0还是0;再用全1矩阵other2进行除法,结果符合预期,但是有个注意事项,scale代表除法的结果再乘以的常数因子,还有最后一个参数dtype表示结果的图像类型,比如测试中是5,那么结果矩阵就是CV_32FC,也就是float型。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!