opencv 简单的图像融合addWeighted

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangpengzp/article/details/87694403

需求:opencv 将图像打上logo并保存这张图片,如下图,将logo 打到 image上,融合函数主要在于方法

addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);

void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype = -1);
参数1:src1,第一张图.
参数2:alpha,第一张图alpha

参数3:src2 第二张图
参数4:beta,第二张图alpha
参数5:gamma,图1与图2作和后添加的数值, 具体看下面公式。不要太大,不然图片一片白。总和等于255以上就是纯白色了。

   dst = src1[i] * alpha + src2 * beta + gamma;

参数6:dst,输出图片
 

注意:输出数组深度位CV_32S时,这个函数不适用,这时可能会内存溢出或者结果不对。

void mixImages() {

	Mat image = imread("images/alpha.png");
	Mat logo0 = imread("images/logo.png");
	Mat logo ;
	// 缩小logo
	resize(logo0, logo, Size(0.5*logo0.cols, 0.5*logo0.rows));

	Mat imageROI;
	//在image mat中取出要打上logo的位置进行融合
	//方法1
	//imageROI = image(Rect(10, 20, logo.cols, logo.rows));
	//方法2
	imageROI = image(Range(10, 10 + logo.rows), Range(20, 20 + logo.cols));

	addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);

	imshow("融合", image);
	//compression_params 为存些图片的参数
	vector<int> compression_params;
	compression_params.push_back(IMWRITE_PNG_COMPRESSION);
	compression_params.push_back(9);    //png格式下,默认的参数为3.
	try {
		// cv 创建的窗口无法显示透明,所以会发现显示的是jpg的图片,保存后用 window图片查看器看图就会有透明显示
		imwrite("addlog.jpg", image, compression_params);
		imwrite("addlog.png", image, compression_params);
	}
	catch (runtime_error& ex) {
		fprintf(stderr, "save image erro %s\n", ex.what());
		return;

	}
}

猜你喜欢

转载自blog.csdn.net/zhangpengzp/article/details/87694403