在前几节的讲解中,我们若想换个演示结果,就需要每次在程序里修改参数值,然后再次运行此程序,用起来很麻烦,若是可以在窗口中实时调整参数值,从而显示结果岂不是很方便。
OpenCV里提供了一个很好用的工具——滑动条(Trackbar),它依附于窗口而存在。
1-createTrackbar()函数
此函数的作用:可以动态调节参数。
int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数说明
- 参数1:滑动条的名称。
- 参数2:窗口的名称,就是说这个创建的滑动条所要依附到哪个窗口上。
- 参数3:表示滑块的位置。在创建时,滑块的初始位置就是该变量当前的值。
- 参数4:表示滑块可以滑到的最大值位置。滑块的最小值始终为0。
- 参数5:TrackbarCallback类型的onChange,它有默认值为0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为 void XXXXX(int, void*);
- 参数6:void*类型的userdata,它也有默认值为0。这个参数是用户传给回调函数的数据,用来处理滑动条的调用。如果使用的第3个参数value实参是全局变量的话,完全可以不用去管这个userdata参数。
======================分割线===============
//功能:用轨迹条来控制两幅图像的Alpha混合
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "【带有滑动条的两图像融合】" //为窗口标题定义的宏
//----------【全局变量声明部分】----------
const int g_nMaxAlphaValue = 100; //Alpha最大值
int g_nAlphaNow; //滑动条此刻对应的值
double g_dAlphaValue; //Alpha值
double g_dBetaValue; //Beta值
Mat g_srcImage1; //源图像1
Mat g_srcImage2; //源图像2
Mat g_dstImage; //输出图像
//-------------【全局函数声明部分】----------------
void on_TrackBarChange(int, void*); //响应滑动条的回调函数
//-------------------【主程序】-----------------
int main(int argc, char** argv)
{
//【1】读取原始图像(两幅图像尺寸需相同)并检查图像是否读取成功
g_srcImage1 = imread("demo01.jpg");
g_srcImage2 = imread("demo02.jpg");
if (g_srcImage1.empty() && g_srcImage2.empty())
{
cout << "读取第一幅图片错误,请重新输入正确路径!\n";
return -1;
}
//【2】设置滑动条初始值为50
g_nAlphaNow = 50;
//【3】创建窗体
namedWindow(WINDOW_NAME, 1);//参数一:窗体名称。参数二:0表示窗口尺寸可手动调整;1表示窗口尺寸为图像尺寸大小,且固定不可调。
//【4】在创建的窗体中创建一个滑动条控件
createTrackbar("透明值", WINDOW_NAME, &g_nAlphaNow, g_nMaxAlphaValue, on_TrackBarChange);
//【5】结果在回调函数中显示
on_TrackBarChange(g_nAlphaNow, 0);
//【6】保持等待状态,按任意键退出
waitKey(0);
return 0;
}
//-------------【响应滑动条的回调函数】----------------
void on_TrackBarChange(int, void*)
{
//求出当前alpha值相对于最大值的比例
g_dAlphaValue = (double)g_nAlphaNow / g_nMaxAlphaValue;
//则beta值为1减去alpha值
g_dBetaValue = (1.0 - g_dAlphaValue);
//调整ahand的大小与ac的大小一致,融合函数addWeighted()要求输入的两个图形尺寸必须相同
resize(g_srcImage2, g_srcImage2, Size(g_srcImage1.cols, g_srcImage1.rows));
//根据alpha和beta值进行线性混合
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//显示效果图
imshow(WINDOW_NAME, g_dstImage);
}