滑动条的创建和使用:
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个参数,用户数据指针。


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

被折叠的 条评论
为什么被折叠?



