#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 "); return -1; } if (!src2.data) { printf("Error loading src2 "); 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 );
记住下面的参数介绍:
- 在标签中显示的文字(提示滑动条的用途) TrackbarName
- 创建的滑动条要放置窗体的名字 “Linear Blend”
- 滑动条的取值范围从 到 alpha_slider_max (最小值只能为 zero).
- 滑动后的值存放在 alpha_slider 变量里
- 每当滑动条的值改变, 就会调用 on_trackbar 回调函数
-
最后, 我们还要定义这个回调函数 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 ); }
注意回调函数中的整型与双精度型的转换:
- 从滑动条中获取的整型值 alpha_slider (integer) 要转换为双精度类型 alpha.
- alpha_slider 的值会在滑动条滑动后被修改.
- 我们所定义的 src1, src2, dist, alpha, alpha_slider 和 beta 都是全局变量, 因此也可以在回调函数中使用.
在分析图像线性混合
通过在范围 内改变 ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (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 进行如下计算
这里 对应于上面代码中被设为 的参数。
-
创建显示窗口,显示图像并等待用户结束程序。
参考: