opencv3编程入门——学习笔记(2)用轨迹条来控制两图像Alpha融合

        自己立下的flag,熬夜也要完成呀,继续更博。今天看到了第三章,对在窗口中加轨迹条,以及简单的alpha融合有了一个简单的认识。

        还是先说alpha融合,其实个人认为就是两幅图片在各自乘上各自的透明度权值然后再用addweight函数做个简单的混合就可以。(上面的那个函数是什么大家可以自行百度,或者参考https://blog.csdn.net/gujiligujili/article/details/7650523)

        然后遇到的一点小问题就是在写轨迹条函数时出现了一个“回调函数”。先解释一下回调函数,说一下自己的理解。回调函数形式上不是由某一条代码明显独立的在主函数中调用,而是在某个其他函数中作为一个对这个函数的响应。(有点乱,举个栗子,A是B的回调函数。意味着,在执行B函数时,A函数作为执行B的一个响应,也会执行。)形式上还要注意,回调函数A的调用不是写在B的函数体内,而是在B的参数中。A的函数名(其实就是这个函数的地址)作为B的一个参数。额。。。不知道讲清楚没,一会看一下代码可能会更明白。

        不多说先上结果:


这其实是两张图,当透明值为0或者为100时就会显示两张原图。


调节透明度后的效果。好了上代码:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

#define WINDOW_NAME "【线性混合示例】"

//----------------------全局变量的声明------------------

const int g_nMaxAlphaValue = 100;//Alpha值的最大值
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值和bete值进行线性混合
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

	//显示效果图
	imshow(WINDOW_NAME, g_dstImage);
}

int main()
{
	g_srcImage1 = imread("1.jpg");
	g_srcImage2 = imread("2.jpg");

	//设置滑动条初始值为70
	g_nAlphaValueSlider = 70;
	
	//创建窗口
	namedWindow(WINDOW_NAME, 1);

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

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

	//结果在回调函数中显示
	on_Trackbar(g_nAlphaValueSlider, 0);

	waitKey(0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_27010559/article/details/80445959