#include <cv.h>
#include <highgui.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
/// 全局变量的声明与初始化
const int alpha_slider_max = 100;
int alpha_slider;
double alpha;
double beta;
/// 声明存储图像的变量
Mat src1;
Mat src2;
Mat dst;
/**
* @function on_trackbar
* @定义响应滑动条的回调函数
*/
void on_trackbar(int, void*)
{
alpha = (double)alpha_slider / alpha_slider_max;
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
imshow("Linear Blend", dst);
}
int main(int argc, char** argv)
{
/// 加载图像 (两图像的大小与类型要相同)
src1 = imread("E:\\VS2015Opencv\\vs2015\\project\\picture\\11.jpg");
src2 = imread("E:\\VS2015Opencv\\vs2015\\project\\picture\\04.png");
if (!src1.data) { printf("Error loading src1 \n"); return -1; }
if (!src2.data) { printf("Error loading src2 \n"); return -1; }
/// 初始化为零
alpha_slider = 0;
/// 创建窗体
namedWindow("Linear Blend", 1);
/// 在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf(TrackbarName, "Alpha x %d", alpha_slider_max);
createTrackbar(TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar);
/// 结果在回调函数中显示
on_trackbar(alpha_slider, 0);
/// 按任意键退出
waitKey(0);
return 0;
}

我们只分析关于滑动条的那段代码:
#.首先, 我们加载了两个图像, 目的是把它们混合显示.
src1 = imread("../../images/LinuxLogo.jpg"); src2 = imread("../../images/WindowsLogo.jpg");
#.在创建滑动条之前, 我们要先创建一个窗体,以便把创建的滑动条放置在上面:
namedWindow("Linear Blend", 1);
现在可以创建滑动条了:
createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
记住下面的参数介绍:
到 alpha_slider_max (最小值只能为 zero).最后, 我们还要定义这个回调函数 on_trackbar 来实现我们想要的结果
void on_trackbar( int, void* )
{
alpha = (double) alpha_slider/alpha_slider_max ;
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
imshow( "Linear Blend", dst );
}
注意回调函数中的整型与双精度型的转换:
在分析图像线性混合
通过在范围
内改变
,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果,就像在幻灯片放映和电影制作中那样
既然我们要执行

我们需要两幅输入图像 (
和
)。相应地,我们使用常用的方法加载图像
src1 = imread("../../images/LinuxLogo.jpg");
src2 = imread("../../images/WindowsLogo.jpg");
Warning
因为我们对 src1 和 src2 求 和 ,它们必须要有相同的尺寸(宽度和高度)和类型。
现在我们生成图像
.为此目的,使用函数 addWeighted 可以很方便地实现:
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
这是因为 addWeighted 进行如下计算

这里
对应于上面代码中被设为
的参数。
创建显示窗口,显示图像并等待用户结束程序。
参考:
原文:https://www.cnblogs.com/fcfc940503/p/11319457.html