OpenCV-除法运算cv::divide

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

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型。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

© 版权声明
THE END
喜欢就支持一下吧
点赞672 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容