9-滑动条(滚动条)创建与实现;createTrackbar()函数

在前几节的讲解中,我们若想换个演示结果,就需要每次在程序里修改参数值,然后再次运行此程序,用起来很麻烦,若是可以在窗口中实时调整参数值,从而显示结果岂不是很方便。

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);
}

阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页