个人资料,仅供学习使用
学习课程:OpenCV4 C++ 快速入门视频30讲——贾志刚

08 回调函数+键盘响应操作

opencv知识点:

  • 回调函数 - callback
  • 键盘响应 - waitKey()

本课所解决的问题:

  • 什么是回调函数(callback)?
  • 在opencv中如何进行键盘响应?
  • 如何利用键盘响应对图像进行操作?
  • 处理视频的时候waitKey的参数应为多少?

1.回顾createTrackbar

在前面的课中,调用createTrackbar时,我们把函数on_lighton_contrast作为参数传入了,这种特别的方式,它被称为callback。回调函数(callback)在很多的UI和界面编程中非常常用 ,它最早在Windows叫做消息机制。

这里我们详细讲解一下回调函数,来加深对这种方式的理解

什么是回调函数

作者:no.body
链接:回调函数(callback)是什么?
来源:知乎

我们绕点远路来回答这个问题。

编程分为两类:系统编程(system programming)和应用编程(application programming)

  • 所谓系统编程,简单来说,就是编写
  • 而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用

系统程序员会给自己写的库留下一些接口,即API(应用编程接口),以供应用程序员使用。
所以在抽象层的图示里,库位于应用的底下。

当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。
但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。

这个被传入的、后又被调用的函数就称为回调函数(callback function)

打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。

  • 这里,“叫醒”这个行为是旅馆提供的,相当于库函数
  • 但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数
  • 而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数

如下图所示(图片来源:维基百科):

回调机制的优势

从上面的例子可以看出,回调机制提供了非常大的灵活性。

请注意,从现在开始,我们把图中的库函数改称为中间函数了。
这是因为回调并不仅仅用在应用和库之间,任何时候,只要想获得类似于上面情况的灵活性,都可以利用回调。

这种灵活性是怎么实现的呢?

乍看起来,回调似乎只是函数间的调用,但仔细一琢磨,可以发现两者之间的一个关键的不同:
在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。
可以这么理解,在传入一个回调函数之前,中间函数是不完整的。

换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为

这就比简单的函数调用,要灵活太多了。

2.键盘响应

接下来是本课的内容,键盘响应。

在opencv中,利用waitKey(),可以实现键盘事件的响应

本函数没用显示图片,点击的图片是main函数中显示的图片
注意:无论是main函数的,还是key_demo函数的,都可以触发键盘事件//函数定义
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;}
}

我们点击图像,按键盘就会打印对应的键

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 图像转为HSVstd::cout << "2" << std::endl;cvtColor(image, dst, COLOR_BGR2HSV);}if (c == 51) {//3 图像亮度+50std::cout << "3" << std::endl;dst = Scalar(50, 50, 50);add(image, dst, dst);}imshow("键盘响应", dst);}
}

初始为黑色

按下1,变为灰度图像

按下2,变为HSV图像

按下3,亮度+50

4.视频处理的waitKey参数

当我们处理视频的时候,waitKey参数应为通常为1,即waitKey(1)

本课所用API查阅

OpenCV 4.6.0 官方文档

waitKey()


【个人笔记】08 回调函数+键盘响应操作相关推荐

  1. opencv快速入门—键盘响应操作

    贾志刚老师-opencv基于c++快速入门基础30讲 本节课程中主要讲解利用键盘实现图像处理过程的便捷操作,如:键盘按下1,图像变成灰度图像:键盘按下2,图像变成hsv色彩空间的图像:键盘按下3,图像 ...

  2. [学习笔记] PHP回调函数的实现方法 [转]

    目录 前言 全局函数的回调 静态函数的回调 对象方法的回调 php事件模型(观察者模式)的实现思路      前言 最近在开发一个PHP系统,为了提高系统的扩展性,我想在系统中加入类似Javascri ...

  3. c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)

    前面两篇文章: http://blog.csdn.net/morixinguan/article/details/65494239 http://blog.csdn.net/morixinguan/a ...

  4. fit函数 model_深度学习与Tensorflow学习笔记2 ——回调函数callbacks和Tensorboard

    上一期我们从Fashion-mnist数据集开始,使用Tensorflow.keras搭建一个简单的神经网络来处理分类问题.通过这个简单例子我们熟悉了tf.keras的调用.本期我们来学习keras下 ...

  5. ROS笔记之回调函数

    Topic接收是通过NodeHandle的成员函数subscribe()和自定义的回调函数实现的,同时回调函数有严格的定义规定:参数只能有一个且必须以const修饰.参数类型为xxxConstPtr. ...

  6. Win32学习笔记 - WndProc回调函数

    Windows操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过GetMessage等方法,最终将消息提交到窗口过程(WndProc)指向一个应用程序定义的窗口过程的指针. 每个窗 ...

  7. 38 --> 详解 OpenWRT RESET按键、键盘响应逻辑

    OpenWrt 按键处理逻辑采用 hotplug 事件方式进行管理,reset按键,用来进行重启或者恢复出厂操作.热插拔事件流程:内核具有检测 键盘守护程序,gpio_button_hotplug 模 ...

  8. ajax post的回调函数另一个方法,jQueryajax–post()方法 - 米扑博客

    jQuery ajax - post() 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); 通过 AJAX POST 请求改变 div 元素 ...

  9. 彻彻底底了解回调函数

    什么是回调函数? 一,回调函数 我们经常在C 设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其 ...

最新文章

  1. 2022-2028年中国再生塑料颗粒行业市场全景调查及发展趋势分析报告
  2. 生物信息学 生物科学、农学、林学、医学
  3. 【Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 /proc/meminfo 文件 | /proc/meminfo 重要字段解析 )
  4. MySQL-入门安装
  5. [C/C++] constexpr函数
  6. 类型“unknown”上不存在属性“foreach”_JavaScript红宝书第四版精简解析系列--映射Map数据类型...
  7. win7系统还原在哪​
  8. 软件开源是如何赚钱?
  9. android webview 多次加载,android – 重复webview,我想在每个加载相同
  10. PHP如何使用IPFS API用法
  11. 给定一个序列,判断该序列是否为二叉树查找树的后序遍历序列
  12. tcp传输控制协议-报文格式
  13. 光储直流微电网能量管理。 系统主要由光伏发电模块、mppt控制模块、混合储能系统模块、直流负载模块、改进前的soc限值管理控制模块
  14. c语言单元测验答案,c语言试题及答案
  15. linux audio device driver音频设备驱动
  16. MongoDB 使用Index
  17. linux文件fflush,Linux fflush 与 fsync的区别
  18. 太牛了,国人纯手工自制CPU,耗时半年,用了3000多个晶体管
  19. vue使表头文字居中,表格某一列文字左对齐的方式
  20. 深度长文:智能手机的社会学研究

热门文章

  1. iPad Air越狱白苹果怎么办?越狱白苹果修复教程
  2. JAVA开发学习——欢迎来到JAVA开发世界!
  3. 将沁园春长沙写出来使用html css,高一语文新教材教案全集 第一课 沁园春 长沙...
  4. 爬虫笔记之刷小怪练级:yymp3爬虫(音乐类爬虫)
  5. 重金砸下近100亿,美团买菜正在偷偷做这件事
  6. WEB网页短信平台网页短信系统上线
  7. 给网赚从业者的几点建议
  8. 数字图像处理-bmp与jpeg格式互相转换
  9. signature=bddf85094ce6d2ceeec3a379a26274b4,Energy Cascades in Granular Gases
  10. Electron-vue开发实战 - 文件下载及进度显示