OpenCV3:图片融合例程——addWeighted(),createTrackbar()函数使用

本文介绍了如何使用OpenCV3的addWeighted()函数进行图片融合,并结合createTrackbar()创建滑动条实现实时调整融合比例。通过滑动条改变融合参数,实现图片线性融合效果的动态调整。

滑动条的创建和使用:

addWeighted(),createTrackbar()函数



//---------------------【滑动条的创建和使用】-----------------------
#include "pch.h"
//#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui.hpp>

#define WINDOW_NAME "【线性混合实例】"  //为窗口标题定义得宏

using namespace cv;
//using namespace std;

//【全局变量声明部分】
const int g_nMaxAlphaValue = 100;//Alpha值的最大值,为int类型
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;

//【声明存储图像的变量】
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;

//【on_Trackbar()函数】:相应滑动条的回调函数
void on_Trackbar(int, void*)
{
	//求出当前alpha值相对于最大值的比例
	g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
	//则beta值为1减去alpha值
	g_dBetaValue = (1.0 - g_dAlphaValue);

	//根据alpha和beta的值进行线性混合
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
	//显示效果图
	imshow(WINDOW_NAME, g_dstImage);
}
//-----------------------------【main()函数】--------------------------
//           控制台应用程序的入口函数,我们的程序从这里开始执行
//---------------------------------------------------------------------
int main(int argc,char** argv)
{
	//加载图像(两图像的尺寸需相同)
	g_srcImage1 = imread("lena.tif");
	g_srcImage2 = imread("lenag.tif");
	if (!g_srcImage1.data)
	{
		printf("读取第一张图片错误,请确定目录下是否有imread函数指定图片存在!\n");
		return -1;
	}
	if (!g_srcImage2.data)
	{
		printf("读取第二张图片错误,请确定目录下是否有imread函数指定图片存在!\n");
		return -1;
	}
    //设置滑动条的初始值为70
	g_nAlphaValueSlider = 70;

	//创建窗体
	namedWindow(WINDOW_NAME, 1);

	//在创建的窗体中创建一个滑动条的控件
	char TrackbarName[50];
	sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);

	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);

	//结果在回调函数中显示
	on_Trackbar(g_nAlphaValueSlider, 0);
	//按任意键退出
	waitKey(0);
	return 0;
}

这次介绍opencv中一个简单的点运算函数,用来实现图片合成。 对应于例程中的 (TUTORIAL) AddingImages 和 (TUTORIAL) AddingImagesTrackbar。

Opencv中提供的函数是addWeighted,用法很简单

图像处理中一个简单而有趣的点运算操作可以用以下的公式表示,可以实现两张图片的线性融合。 这里α 表示两种图片的融合比例,这个g(x) 表示 融合图片中的像素点,f0(x) 和 f1(x) 分别表示背景和前景图片中的像素点。

addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

opencv 通过 addWeighted 函数实现图片的线性融合,这个函数在之前的例程中也有提到过。

这个函数的原型如下所示,可以看出这个函数最小需要6个参数。

1、 第1个参数,输入图片1,

2、第2个参数,图片1的融合比例

3、第3个参数,输入图片2

4、第4个参数,图片2的融合比例

5、第5个参数,偏差

6、第6个参数,输出图片

二、利用highgui库中的 createTrackbar 函数创建一个滑块,函数的原型如下

createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
int createTrackbar(const string& trackbarname, const string& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

可以看到,这个函数有6个参数,最后一个为用户数据的指针,类似回调函数中的用户数据指针。

1、第一个参数,为滑块的名字

2、第二个参数,为滑块所在窗口的名字,用来获取窗口的handle

3、第三个参数,为传人一个数据的指针,通过滑块来改变该数据的值,该变量需要在回调函数TrackbarCallback 中作用域可见,因此例程中将它定义为全局变量

4、第四个参数,为传人数据的最大值,用来控制数据的变化范围

5、第五个参数,回调函数的函数指针,当滑块变化时,便调用回调函数,实现融合画面随着滑块的滑动而变化 下面我们来看下回调函数 on_trackbar, 它被定义了成一个static函数,意味着函数生命周期从被调用开始一直存在知道程序结束,第二个参数对应createTrackbar函数中的

第6个参数,用户数据指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值