createTrackbar()函数原型如下
int createTrackbar( const String & trackbarname,//滑动条名称
const String & winname,//所在窗口名称
int * value,//value为指向int的指针,用于返回滑动条当前值
int count,//滑动条条最大值,默认值最小为0
TrackbarCallback on_Change = 0,//回调函数
void * userdata = 0 //用户创给回调函数的数据,用于处理轨迹事件,默认值为0
)
//滑动条的创建和使用
#include<opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
#define WINDOW_NAME "【线性混合示例】"//为窗口名称定义的宏
const int g_nMaxAlphaValue = 100; //Alpha的最大值
int g_nAlphaValueSlider;//滑动条对应的变量(global,int)
double g_dAlphaValue;//声明当前Alpha相对于最大值所占比例变量(global,double)
double g_dBetaValue;//当前Beta相对于最大值所占比例
Mat g_srcImage1;//声明存储图像的变量
Mat g_srcImage2;
Mat g_dstImage;//声明混合图像变量
void on_Trackbar(int, void*)//响应滑动条的回调函数
{
g_dAlphaValue = double(g_nAlphaValueSlider) / g_nMaxAlphaValue; //当前Alpha相对于最大值所占比例(global,double)
g_dBetaValue = (1.0 - g_dAlphaValue); //当前Beta相对于最大值所占比例(global,double)
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0, g_dstImage);//图像的叠加
imshow(WINDOW_NAME, g_dstImage);//在指定窗口显示图像
}
int main(int argc, char * * argv[])//argc 命令行参数个数,argv
{
g_srcImage1 = imread("333.jpg");//载入第一幅图
g_srcImage2 = imread("111.jpg");//载入第二幅图
if(!g_srcImage1.data)
{
std::cout << "读取第一幅图片错误,请确定工程目录下是存在imread读取的图片!";
return -1;
}
if(!g_srcImage2.data)
{
std::cout << "读取第一幅图片错误,请确定工程目录下是f否存在imread读取的图片!";
return -1;
}
g_nAlphaValueSlider = 50;//设置滑条初值为50
namedWindow(WINDOW_NAME);
char TrackbarName[50];//声明滑动条的名称存储变量
sprintf(TrackbarName, "透明度%d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);//创建滑动条
//TrackbarName:滑动条的名字
//WINDOW_NAME:窗口名称
//&g_nAlphaValueSlider :滑块当前位置的值,(将g_nAlphaValueSlider的地址返回给指针)
// g_nMaxAlphaValue:滑动条的最大值
//on_Trackbar:回调函数名,用于显示混合图像
//此处使用函数名on_Trackbar,函数名相当于指向该函数地址的指针
on_Trackbar(g_nAlphaValueSlider,0);//结果在回调函数中显示
waitKey(0);
return 0;
}
采用图像来自网络,大小均为1500x843:
333.jpg
111.jpg
****************************分割线************************************
最终效果如下图:
1.透明度为60
2.透明度为100
3.透明度为0