最简易的实例,该说的都在代码里了。
#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; }
效果
alpha = 0
alpha = 100
alpha = 50