• 影像叠加+滑动条


    #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);
    
    1. 现在可以创建滑动条了:

      createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
      

      记住下面的参数介绍:

      • 在标签中显示的文字(提示滑动条的用途) TrackbarName
      • 创建的滑动条要放置窗体的名字 “Linear Blend”
      • 滑动条的取值范围从 0 到 alpha_slider_max (最小值只能为 zero).
      • 滑动后的值存放在 alpha_slider 变量里
      • 每当滑动条的值改变, 就会调用 on_trackbar 回调函数
    2. 最后, 我们还要定义这个回调函数 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 的值会在滑动条滑动后被修改.
      • 我们所定义的 src1src2distalphaalpha_slider 和 beta 都是全局变量, 因此也可以在回调函数中使用.

    在分析图像线性混合

    通过在范围 0 
ightarrow 1 内改变 alpha ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果,就像在幻灯片放映和电影制作中那样

    1. 既然我们要执行

      g(x) = (1 - alpha)f_{0}(x) + alpha f_{1}(x)

      我们需要两幅输入图像 (f_{0}(x) 和 f_{1}(x))。相应地,我们使用常用的方法加载图像

      src1 = imread("../../images/LinuxLogo.jpg");
      src2 = imread("../../images/WindowsLogo.jpg");
      

      Warning

      因为我们对 src1 和 src2 求  ,它们必须要有相同的尺寸(宽度和高度)和类型。

    2. 现在我们生成图像 g(x) .为此目的,使用函数 addWeighted 可以很方便地实现:

      beta = ( 1.0 - alpha );
      addWeighted( src1, alpha, src2, beta, 0.0, dst);
      

      这是因为 addWeighted 进行如下计算

      dst = alpha cdot src1 + eta cdot src2 + gamma

      这里 gamma 对应于上面代码中被设为 0.0 的参数。

    3. 创建显示窗口,显示图像并等待用户结束程序。

    参考:

    影像相加(add、addWeighted)

  • 相关阅读:
    9.5---所有字符串的排列组合(CC150)
    9.4---集合子集(CC150)
    9.3---魔术索引(CC150)
    5.3(2)----机器人走方格2(CC150)
    9.2---机器人走方格(CC150)
    9.1---上楼梯(CC150)
    5.3---找最近的两个数(CC150)
    5.8---像素设定(CC150)
    7.4---加法替代运算(CC150)
    4.9---二叉树路径和(CC150)
  • 原文地址:https://www.cnblogs.com/fcfc940503/p/11319457.html
Copyright © 2020-2023  润新知