滑动条是opencv动态调节参数特别好用的一种工具,它依附于窗口而存在。
我们这里便是应用滑动条实现了小鸟游六花两张美图的转化(doge
创建滑动条:createTrackbar()函数
int createTrackbar(const string&trackname,const string&winname,int*value,int count,TrackbarCallback onchange=0,void*userdata=0);
第一个参数:轨迹条名称
第二个参数:窗口名称
第三个参数:滑块位置
第四个参数:滑块最大值
第五个参数:回调函数
第六个参数:传给回调函数的数据,当value为全局变量是不用写
完整代码如下:(感觉注释写的还算详细)
#include <iostream>
#include<opencv2\opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
#define WINDOW_NAME "邪王真眼是最强的"
const int g_maxvalue = 100;//Alpha值的最大值
int g_nsilder;//滑动条对应的变量
double g_davalue;
double g_bvalue;
//声明储存图像的变量
Mat src1;
Mat src2;
Mat dst;
//全局变量声明部分
void on_Trackbar(int, void*)
{
g_davalue = (double)g_nsilder / g_maxvalue;//求出当前alpha值相对于最大值的比例
g_bvalue = (1.0 - g_davalue);//则beta值为1-alpha
addWeighted(src1, g_davalue, src2, g_bvalue, 0.0, dst);//线性混合
imshow(WINDOW_NAME, dst);
}
//响应滑动条的回调函数
int main(int argc,char **argv)
{
//加载图像(两图像尺寸需相同)
src1 = imread("3.jpg");
src2 = imread("4.jpg");
g_nsilder = 70;//设置滑动条初值为70
namedWindow(WINDOW_NAME, WINDOW_NORMAL);//可以自由变化大小的窗口
char TrackbarName[50];
sprintf_s(TrackbarName, "纯净度 %d", g_maxvalue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nsilder, g_maxvalue, on_Trackbar);
//创建滑动条控件
on_Trackbar(g_nsilder, 0);
//结果在回调函数中显示
waitKey(0);
//按任意键退出
return 0;
}
图片素材如下
欢迎大家的讨论,谢谢大家(