opencv入门(6) TrackBar调整图片和键盘响应

文章目录

  • [1 创建trackbar](#1 创建trackbar)
  • [2 使用userdata传入函数](#2 使用userdata传入函数)
  • [3 键盘响应](#3 键盘响应)

1 创建trackbar

1.trackbar名称 2.创建在哪个窗口上 3.拖动trackbar改变的值 4.trackBar的最大值

5.trackbar改变时的回调函数 6. 带入回调函数的数据,可以不用带,是一个void指针

createTrackbar("Value bar", "亮度调整", &lightness, max_value, on_tract);

cpp 复制代码
Mat temp;
Mat dst;
Mat m;
Mat src;
int lightness = 50;
static void on_tract(int, void*)
{
	m = Scalar(lightness, lightness, lightness);
	add(src, m, dst);
	imshow("亮度调整", dst);


}


void QuickDemo::trackbar_demo(Mat &image)
{
	namedWindow("亮度调整", WINDOW_AUTOSIZE);
	dst = Mat::zeros(image.size(), image.type());
	//dst = image + Scalar(50, 50, 50);
	m = Mat::zeros(image.size(), image.type());
	src = image;
	int max_value = 100;
	

	// 1.trackbar名称 2.创建在哪个窗口上 3.传的值 4.trackBar的最大值
	// 5.trackbar改变时的回调函数 6. 需要带入的数据,可以不用带,是一个void指针
	createTrackbar("Value bar", "亮度调整", &lightness, max_value, on_tract);

	on_tract(50, 0);
}

2 使用userdata传入函数

在createTrackbar中,将image通过参数传入到回调函数中,(void*)(&image);

在下面调用on_tract函数中,需要传入image

cpp 复制代码
void QuickDemo::trackbar_demo(Mat &image)
{
	namedWindow("亮度调整", WINDOW_AUTOSIZE);
	dst = Mat::zeros(image.size(), image.type());
	//dst = image + Scalar(50, 50, 50);
	m = Mat::zeros(image.size(), image.type());
	int max_value = 100;
	int lightness = 50;
	// 1.trackbar名称 2.创建在哪个窗口上 3.传的值 4.trackBar的最大值
	// 5.trackbar改变时的回调函数 6. 需要带入的数据,可以不用带,是一个void指针
	createTrackbar("Value bar", "亮度调整", &lightness, max_value, on_tract,(void*)(&image));

	on_tract(50, &image);
}

修改on_tract的函数,获取userdata

cpp 复制代码
static void on_tract(int b, void* userdata)
{
	Mat image = (*(Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());;
	Mat m = Mat::zeros(image.size(), image.type());;
	
	m = Scalar(lightness, lightness, lightness);
	add(dst, m, image);
	imshow("亮度调整", dst);


}

同样可以调整其他的属性

比如增强对比度,这里用addWeighted();来进行叠加

这个函数主要是dst = src1alpha + src2 beta + gamma;

alpha 是 src1的权重,beta是src2的权重,gamma加到最终结果的标量值用于调整图像的整体亮度

cpp 复制代码
	int contrast_value = 100;
	createTrackbar("Contrast Bar", "亮度调整", &contrast_value, 200, on_weighted_tract, (void*)(&image));
	on_weighted_tract(50, &image);

static void on_weighted_tract(int b, void* userdata)
{
	Mat image = (*(Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());;
	Mat m = Mat::zeros(image.size(), image.type());;

	
	double alpha = b/100.0;
	double beta = 0.0;
	double gamma = 0;

	// 这里相当于m没有权重,只有第一张图有权重,通过调整alpha的值来调整值的对比度
	addWeighted(image, alpha, m, beta, gamma, dst);

	imshow("亮度调整", dst);


}

对比度是两个像素点的差值,增加对比度,会让两个像素点之间的差距会变大

亮度是所有像素点的值都同步改变

3 键盘响应

监听视频的时候,waitkey(1);永远是1

cpp 复制代码
void QuickDemo::key_demo(Mat &image)
{
	Mat dst;
	while (true)
	{
		// 监听键盘操作
		int c = waitKey(100);
		

		if (c == 27) // key #esc
		{
			break;
		}
		if (c == 49)
		{
			std::cout << "print key #1" << std::endl;
			cvtColor(image, dst, COLOR_BGR2GRAY);
		}
		if (c == 50)
		{
			std::cout << "print key #2" << std::endl;
			cvtColor(image, dst, COLOR_BGR2GHSV);
		}
		if (c == 51)
		{
			std::cout << "print key #3" << std::endl;
			dst = Scalar(50, 50, 50);
			add(image, dst, dst);
		}

		imshow("键盘响应", dst);

	}