OPENCV 调节滑动条的创建

一、为什么要用滑动条


有时候需要对 opencv 某个函数进行动态调参,这时候就要使用到 opencv 提供的滑动条工具

该滑动条滑动时可以动态的改变我们的参数,对图像处理时有非常好的辅助效果

该滑动条是由 createTrackbar() 函数创建

二、createTrackbar 函数


 createTrackbar 函数原型

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

trackbarname滑动条的名字(就是滑动条旁边那个标签名字)

winname :      附在的窗口名字(要与 cv::namedWindow 创建的名字一致 )

value:             就是滑动条当前位置的值

count:             滑动条最大的值

onChange :    这是一个回调函数,要传一个函数指针进去

userdata:        用户自定义的数据,比如你想传什么数据过去

 

TrackbarCallback onChange 回调函数原型

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

举个栗子,可以这样定义

static void onTrack(int pos, void* usrdata)
{
	cv::subtract(*((cv::Mat*)usrdata), cv::Scalar(pos, pos, pos), dst);
	cv::imshow(window_name, dst);
}

三、测试例子


#include 
#include 

cv::Mat src, dst;
const char *window_name = "滑块调整图像亮度";// 窗口名字
int light_value_cur = 50;		// 初始亮度值
int light_value_max = 255;		// 亮度最大值

// 滑块回调函数
static void onTrack(int pos, void* usrdata)
{
	cv::subtract(*((cv::Mat*)usrdata), cv::Scalar(pos, pos, pos), dst);
	cv::imshow(window_name, dst);
}

int main()
{
	src = cv::imread("./image/4.jpg");
	if (src.empty()) {
		std::cout << "imread image fail!" << std::endl;
		return -1;
	}

	cv::namedWindow(window_name, cv::WINDOW_AUTOSIZE);

	// 创建鼠标滑块 范围[0, light_value_max]
	cv::createTrackbar(cv::String("亮度:"), window_name, &light_value_cur, light_value_max, onTrack, &src);
	onTrack(50, &src); // 手动调用,方便图像根据值进行初始化

	cv::waitKey(0);
	cv::destroyAllWindows();

	return 0;
}

调试结果

 

四、_End

1

 

你可能感兴趣的:(opencv,opencv,计算机视觉,人工智能)