自己立下的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; }