08 键盘响应操作
opencv知识点:
- callback - 回调函数
 - waitKey - 键盘响应
 
本课所解决的问题:
- 什么是回调函数(callback)?
 - 在opencv中如何进行键盘响应?
 - 如何利用键盘响应对图像进行操作?
 
1.简述回调函数(callback)
我们前面createTrackbar中,我们把函数on_light,on_contrast作为参数传入了
 这种特别的方式,它被称为callback
为了方便之后的学习,我们来对callback进行一下简述
什么是回调函数?
我们绕点远路来回答这个问题。
编程分为两类:系统编程(system programming)和应用编程(application programming)。
- 所谓系统编程,简单来说,就是编写库
 - 而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。
 
这个被传入的、后又被调用的函数就称为回调函数(callback function)。
如下图所示(图片来源:维基百科):
 
回调机制的优势
从上面的例子可以看出,回调机制提供了非常大的灵活性。
这种灵活性是怎么实现的呢?
这就比简单的函数调用,要灵活太多了。
2.键盘响应
在opencv中,利用waitKey,可以实现键盘事件的响应
//函数定义
void key_demo(Mat& image);
//函数实现
void QuickDemo::key_demo(Mat& image) {
	while (true) {
		char c = waitKey(1000);
		/*
		用char存储,能存储一些字符,但像esc这些就无法存储
		为了存储这些功能键,我们可以转为int存储方式,存储它们对应的ASCII码值
		*/
		//int c = waitKey(1000);
		std::cout << c << std::endl;
	}
	/*
	本函数没用显示图片,点击的图片是main函数中显示的图片
	注意:无论是main函数的,还是key_demo函数的,都可以触发键盘事件
	之后利用了这个函数实现键盘响应
	*/
}
 
我们点击图像,按键盘就会打印对应的键
 
3.利用键盘进行图像操作
我们利用键盘响应,来实现对图像的操作
void QuickDemo::key_demo(Mat& image) {
	Mat dst = Mat::zeros(image.size(), image.type());
	while (true) {
		int c = waitKey(100);
		if (c == 27) {//退出
			break;
		}
		if (c == 49) {//1 图像转为灰度
			std::cout << "1" << std::endl;
			cvtColor(image,dst,COLOR_BGR2GRAY);
		}
		if (c == 50) {//2 图像转为HSV
			std::cout << "2" << std::endl;
			cvtColor(image, dst, COLOR_BGR2HSV);
		}
		if (c == 51) {//3 图像亮度+50
			std::cout << "3" << std::endl;
			dst = Scalar(50, 50, 50);
			add(image, dst, dst);
		}
		imshow("键盘响应", dst);
	}
}
 
初始为黑色
 
 按下1,变为灰度图像
 
 按下2,变为HSV图像
 
 按下3,亮度+50
 
本课所用API查阅
1.waitKey
 










