OpenCV创建滑动条

利用OpenCV的createTrackbar()函数创建一个可以 调整数值的滑动条,并将滑动条附加到指定的窗口上。

createTrackbar函数的原型:

int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

第一个参数trackbarname是轨迹条的名字,代表我们创建的轨迹条。

第二个参数winname是窗口的名字,代表这个轨迹条会依附到哪个窗口上,即对应 nameWindow()创建窗口时填的某一个窗口名。

第三个参数是一个指向整形的指针,表示滑块的位置。在创建时,滑块的初始值就是该变量当前的值。

第四个参数是int型的count,表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0。

第五个参数,是TrackbarCallBack类型的onchange,默认值为0,其中TrackbarCallBack是 函数指针:

typedef void (*TrackbarCallback)(int pos, void* userdata);

这是一个指向 回调函数 的指针,每次滑块位置改变时,这个函数都会进行回调。这个函数的返回值是void型,两个参数分别是int型和void*型,第一个参数int pos表示轨迹条的位置,第二个参数void* userdata 是用户数据(见下面第六个参数)。如果回调函数是NULL指针,则表示没有回调函数的调用,仅仅是createTrackbar()函数的第三个参数value的值有变化。

第六个参数,void*类型的userdata,默认值是0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value的实参是全局变量的话,可以不用管这个userdata参数。

一、代码:

#include <opencv2/opencv.hpp>
//#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <opencv2/imgproc/imgproc.hpp>
//#include <iostream>
using namespace cv;


//----------------------------【宏定义部分】----------------------------
//描述:定义一些辅助宏
constexpr auto WINDOW_NAME = "【线性混合示例】";    //为窗口标题定义的宏;

//----------------------------【全局变量声明部分】----------------------------
//描述:定义一些全局变量
const int g_nMaxAlphaValue = 100;   //Alpha值的最大值
int g_nAlphaValueSlider;            //滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;

//声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;

//----------------------------【On_Trackbar()函数】----------------------------
//描述:响应滑动条的 回调函数
void on_Trackbar(int, void*)
{
	//求出当前alpha值相对于最大值的比例
	g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
	//则beta值为 1减去alpha的值
	g_dAlphaValue = (1.0 - g_dAlphaValue);

	//根据 alpha 和 beta 的值 进行 线性混合 addWeighted()函数
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dAlphaValue, 0.0, g_dstImage);
        //void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
	//dst = src1[I]*alpha + src2[I]*beta + gamma;
	//显示效果图
	imshow(WINDOW_NAME, g_dstImage);
}

//----------------------------【main函数】----------------------------
int main()
{
	// 加载图像(两图像的尺寸需相同)
	g_srcImage1 = imread("F:\\TuPian\\1.jpg",1);
	g_srcImage2 = imread("F:\\TuPian\\2.jpg",1);
	if (g_srcImage1.data == NULL)
	{
		printf("读取第一幅图片错区,请确定目录下是否有imread函数指定的图片存在!\n");
		return -1;
	}
	if (g_srcImage2.data == NULL)
	{
		printf("读取第一幅图片错区,请确定目录下是否有imread函数指定的图片存在!\n");
		return -1;
	}

	// 设置滑动条初值为70
	g_nAlphaValueSlider = 70;

	// 创建窗体
	namedWindow(WINDOW_NAME, 1);    //注意是namedWindow,不是nameWindow

	//在创建窗体中创建一个滑动条控件
	char TrackbarName[50];
	sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);

	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);  //onTrackbar是回调函数

	//结果在回调函数中显示
	on_Trackbar(g_nAlphaValueSlider, 0);

	//按任意键退出f
	waitKey(0);

	return 0;
	//std::cout << "Hello World!\n"; 
}

二、效果:

 

 可以调整滑动条来改变混合效果:

参考:《OpenCV3编程入门》毛星云、冷雪飞等编著,电子工业出版社,2018年11月第19次印刷,p73-76。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章