opencv4 滑动条控件+图片线性混合

最简易的实例,该说的都在代码里了。

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "test"

struct data{
    int* value_mx;
    Mat* img1;
    Mat* img2;
};

// 回调函数,第一个值为滑动条的位置
// 第二个值为用户传来的数据的指针,
//      一定是void*的,所以使用的时候要做类型转换
void on_Trackbar(int value_now, void *usrdata)
{
    data* d = (data*)usrdata;

    int v_mx = *((*d).value_mx);
    Mat img1 = *((*d).img1);
    Mat img2 = *((*d).img2);
    Mat res;
    
    double alpha = (double)value_now / (double)v_mx;
    double bata = 1 - alpha;
    addWeighted(img1, alpha, img2, bata, 0.0, res);
    imshow(WINDOW_NAME,res);
}

int main(int argc, char ** argv)
{
       //加载图像,都得是jpg
        Mat _img1 = imread("/home/eva/图片/Wallpapers/kuangsan.jpg");
        Mat _img2 = imread("/home/eva/图片/Wallpapers/f2.jpg");

        //两图像的尺寸需相同,所以我直接切割了
        Mat img1(_img1,Rect(0,0,1000,1000));
        Mat img2(_img2, Rect(0, 0, img1.cols, img1.rows));

       // 设置滑动条的最大值为100
       int value_mx = 100;
       // 设置滑动条的初值为60
       int value_now = 60;

       // 创建窗体
       namedWindow(WINDOW_NAME, 1);

       //等会线性混合时需要用到的数据
       data x;
       x.value_mx = &value_mx;
       x.img1 = &img1;
       x.img2 = &img2;

       // 在创建的窗体中创建一个滑动条控件
       createTrackbar("a", WINDOW_NAME, &value_now, value_mx, on_Trackbar,&x);
       /*
       参数说明:
       1.滑动条名称
       2.滑动条附加在哪个窗体上
       3.滑动条的当前值,一直是变化的
       4.滑动条的最大值
       5.回调函数,每次滑动条变化,都会被调用
       6.用户要传给回调函数的数据
        */

       waitKey(0);
       return 0;
}
View Code

 

效果

alpha = 0

 

alpha = 100

alpha = 50

 

posted @ 2020-05-13 14:54  Init_Rain  阅读(235)  评论(0编辑  收藏  举报