1.2、滑动条的创建和使用

文章目录

  • 前言
  • 一、createTrackbar
  • 二、回调函数
  • 三、addWeighted
  • 四、滑动条的创建和使用示例
  • 总结


前言

滑动条作为OpenCV动态调节参数的一个工具,主要是依附窗体而存在。本文将结合两幅图像的线性混合对滑动条的创建和使用进行详细的讲解,其中主要是基于createTrackbar和addWeighted两个函数的运用。下面我们就直接进入主题吧!


一、createTrackbar

作用:createTrackbar函数用于创建一个具有特定名称和范围的轨迹条,并将滑动条依附在指定的窗口,可以实现动态调节参数。
官方文档:
int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);
函数讲解:
第一个参数:trackbarname 作为轨迹条的名字,用于代表我们所创建的轨迹条。
第二个参数:winname 作为窗口的名字,表示我们所创建的轨迹条依附于哪一个窗口,即对应我们namedWindow所创建的窗口名。
第三个参数:int* value 一个指向整型的指针,表示滑块的位置,我们创建时所填写的值,作为滑块的初始值。
第四个参数:count 即滑块所能到达的最大值,最小值始终都是0。
第五个参数:TrackbarCallback onChange = 0,作为一个指向回调函数的指针,每当滑块的位置发生改变时,对应的这个函数都会进行一次回调。而所对应的这个函数原型必须为void function(int,void*),其中的第一个参数为滑块的初始值,第二个参数是用户数据。当回调是一个NULL的指针时,则没有调用回调函数,仅仅只是value的该表而已。

二、回调函数

回调函数是一个通过函数指针调用的函数,当我们将函数的指针作为一个参数传递给另一个函数,这个指针被用于调用所指的函数时,就称为回调函数。回调函数不是简地由该函数的实现方直接调用,而是在特定的事件或事件发生时由另一方调用,对于该事件或条件进行响应。

三、addWeighted

作用:计算两个数组(图像阵列)的加权和。
官方文档:
void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype = -1);
函数讲解:
第一个参数:InputArray src1 表示需要加权的第一个数组。
第二个参数:double alpha 表示第一个数组的权重。
第三个参数: InputArray src2 表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数:double beta 表示第二个数组的权重。
第五个参数:double gamma 一个加到权重总和上的标量值。
第六个参数:OutputArray dst 表示输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第七个参数:int dtype = -1 输出阵列的可选深度,默认值-1。

四、滑动条的创建和使用示例

下面我们直接用一个简单的示例来加深对这几个函数的印象。
#include 
#include 
using namespace std;
using namespace cv;

const int Max_Value = 100;
#define WINDOW_NAME "线性混合"
int Default_Value;

Mat unicorn;
Mat starry_sky;
Mat dst;

void On_Trackbar(int, void*)
{
     
	double alpha = (double)Default_Value / Max_Value;
	double beta = (1.0 - alpha);
	addWeighted(unicorn, alpha, starry_sky, beta, 0.0, dst);
	imshow(WINDOW_NAME, dst);
}

int main()
{
     
	//1、载入两幅大小、类型一致的图像
	unicorn = imread("unicorn.png");
	if (!unicorn.data)
	{
     
		printf("Image not loaded , please enter the correct file path .");
		return -1;
	}
	starry_sky = imread("starry_sky.png");
	if (!starry_sky.data)
	{
     
		printf("Image not loaded , please enter the correct file path .");
		return -1;
	}
	
	//2、创建滑动条参数前期准备
	string Trackbar_Name = "透明度";
	namedWindow(WINDOW_NAME);
	Default_Value = 30;

	//3、创建滑动条
	createTrackbar(Trackbar_Name, WINDOW_NAME, &Default_Value, Max_Value, On_Trackbar);

	//4、结果在回调函数中显示
	On_Trackbar(Default_Value, 0);

	waitKey(0);
	return 0;
}


总结

好啦!滑动条的创建和使用就介绍到这里啦!我们下期再会~

你可能感兴趣的:(深入浅出OpenCV,opencv,图像处理)