提示:阅读文章,大约需要3分钟


问题描述

在使用OpenCV编程的时候,我们经常会使用按键等待函数:waitKey(),大家可能会用它来作为 延迟、等待用户输入按键的功能使用,以下列出了在使用过程中遇到的几种常见的问题,包括按键失效、程序崩溃、按键“不灵敏” 三类问题。


1、按键失效:

按下按键后,程序没有任何反应

原因1:waitKey()必须在OpenCV的GUI界面才可以使用,比如用imshow()创建的窗口上,waitKey才是有效的。
而在cmd控制台命令行窗口或其他IDE交互窗口都是无效的。

原因2:OpenCV的GUI窗口没有被聚焦。
waitKey() 函数只有在窗口获得焦点的时候才有效,如果焦点在电脑其他窗口上,OpenCV是不会接受按键事件的。
鼠标点击GUI窗口就可以获得焦点。

2、按键导致程序崩溃

按下按键之后,GUI窗口直接卡死,可能会显示未响应或程序异常、中断异常等,例如下图:

原因:出现这种状况通常是没有对GUI窗口进行销毁。

# 销毁窗口
# python
cv.destroyAllWindows()  # 销毁所有窗口
cv.destroyWindow('name')  # 销毁指定窗口:name

因为OpenCV显示图像是采用流式传输显示,当没有数据传输给GUI窗口时,而窗口仍要进行显示,就会出现上述崩溃的情况,因此需要进行销毁窗口的操作。

3、按键“不灵敏”

有时候我们需要根据输入按键来执行不同的操作,但有时候会出现“不灵敏”的状况:按键有时候有效,有时候无效。这是什么原因呢?这应该是编程的问题了,来看看你的代码是不是跟下面的错误写法一样:

# python
# 错误写法
while True:if cv.waitKey(10) == ord('b'):print('B')elif cv.waitKey(10) == ord('l'):print('L')elif cv.waitKey(10) == ord('q'):print('Q')

我们的目的是当按下键盘 B 的时候打印 “B”,以及按键 L 和 按键 Q 也是打印对应的值,但是,如果像上面这样编程的话就是错误的写法。

原因
调用cv.waitKey(10)函数 ,程序会等待用户10毫秒(一般会超过10毫秒),当在这段时间内输入的按键就会被程序接收,但是上面的程序经历了3次10毫秒,当你按下键盘 B 的时候,程序可能在另外两个10毫秒中等待键盘 L 和键盘 Q,这样你按下键盘 B 就会无效,如果程序刚好在等待键盘 B 时,你按下键盘 B, 那这样就会有效,所以就会出现这样“不灵敏”的状况。

# python
# 正确写法
while True:key = cv.waitKey(10)if key == ord('b'):print('B')elif key == ord('l'):print('L')elif key == ord('q'):print('Q')

总结

此处列举了三类导致waitKey()函数失效的问题,可能是GUI窗口不存在、GUI没有被聚焦、当不再显示图像时窗口没有被销毁、编程不规范原因所致。当然可能还有别的意外情况导致,欢迎交流。


以下是python-OpenCV官方定义中关于waitKey() 函数的注释

引用自python-OpenCV的__init__.py文档

def waitKey(delay=None): # real signature unknown; restored from __doc__"""waitKey([, delay]) -> retval.   @brief Waits for a pressed key..   .   The function waitKey waits for a key event infinitely (when \f$\texttt{delay}\leq 0\f$ ) or for delay.   milliseconds, when it is positive. Since the OS has a minimum time between switching threads, the.   function will not wait exactly delay ms, it will wait at least delay ms, depending on what else is.   running on your computer at that time. It returns the code of the pressed key or -1 if no key was.   pressed before the specified time had elapsed..   .   @note.   .   This function is the only method in HighGUI that can fetch and handle events, so it needs to be.   called periodically for normal event processing unless HighGUI is used within an environment that.   takes care of event processing..   .   @note.   .   The function only works if there is at least one HighGUI window created and the window is active..   If there are several HighGUI windows, any of them can be active..   .   @param delay Delay in milliseconds. 0 is the special value that means "forever"."""pass

参考译文:

当键事件为正数时,waitKey函数将无限地等待键事件,或等待delay毫秒。由于操作系统在切换线程之间有最小的时间间隔,所以函数不会恰好等待delay毫秒,它至少会等待delay毫秒,这取决于此时计算机上运行的其他操作。它返回已按下的键的代码,如果在指定的时间过去之前没有按下键,则返回-1。
这个函数是HighGUI中唯一能够获取和处理事件的方法,因此需要定期调用它来进行正常的事件处理,除非HighGUI是在一个负责事件处理的环境中使用的。
该函数仅在创建了至少一个HighGUI窗口并且该窗口是活动的情况下才有效。如果有几个HighGUI窗口,它们中的任何一个是活动的都可以。
参数delay 延迟毫秒。0是代表“永远”的特殊值。

.

OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)相关推荐

  1. OpenCV中waitKey()函数的深度解析

    while (char(waitKey(1)) != 'q') {} 相信不少,都是冲着这句代码来的,是不是无法退出? 注意:鼠标必须激活当前窗口, 即鼠标要点一下窗口(图像),不然要是放在cmd窗口 ...

  2. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

  3. openCV中waitKey函数介绍

    #include <opencv2/opencv.hpp> #include < iostream > #include <window.h> using name ...

  4. Opencv中直方图函数calcHist

    Opencv中直方图函数calcHist calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式.最难理解 ...

  5. OpenCV中flip函数实现

    一.flip()函数原型介绍 void cv::flip(InputArray src,OutputArray dst, int flipCode) 各参数含义 src:输入图像. dst:输出图像. ...

  6. OpenCV中initUndistortRectifyMap函数存在bug原因探究

    原文首发于公众号「3D视觉工坊」:OpenCV中initUndistortRectifyMap函数存在bug原因探究. 最近在运行如下一段代码时,生成的mapx和mapy有点异常. 代码片段如下: # ...

  7. 转载:opencv中imshow函数运行中断的解决办法

    OpenCV中 imshow函数运行中断的解决方法 羊和咩咩 2017-03-10 16:00:49 5919 收藏 最后发布:2017-03-10 16:00:49首发:2017-03-10 16: ...

  8. 关于opencv中cvtcolor函数的code参数用CV_BGR2YUV与CV_BGR2YCrCb的了解

    根据Opencv中cvtcolor函数的源码描述,,参数CV_BGR2YCrCb用的系数为[1868, 9617, 4899, 11682, 9241], 而参数CV_BGR2YUV对应的系数只是将C ...

  9. 关于Opencv中Filter2D函数的补全方式

    目录 关于Opencv中Filter2D函数的补全方式 环境 验证 C++举例 Python举例 关于Opencv中Filter2D函数的补全方式 环境 OpenCV3.4.16(C++) openc ...

最新文章

  1. windows server 2016 安装指南
  2. 微软职位内部推荐-Software Engineer II
  3. 计算机网络·物理层练习题
  4. Interview:互联网IT界技能进阶必备—各个职位推荐几个高含金量的证书
  5. CodeForces - 1058D D. Vasya and Triangle
  6. 2020牛客暑期多校训练营(第二场)
  7. 2019.7.5刷题统计
  8. Kafka配置5--Windows下配置Kafka的集群+SASL+SSL
  9. HDOJ(HDU) 2097 Sky数(进制)
  10. Web前端干货!30道Web前端面试题精选,你会几个?
  11. 嵌入式系统之CMSIS学习笔记
  12. 最是人间四月天,细雨点洒樱花前
  13. 计算机无法安装cad,AutoCAD 2022不能安装是为什么?安装AutoCAD Electrical 2022时显示“无法安装:此计算机不满足最低要求”...
  14. TTL与CMOS电路小结
  15. java变量同名_Java成员变量与局部变量同名
  16. 华硕电脑连接不上wifi_笔记本无法连接无线网络WiFi的解决办法
  17. 使用80percent开发rails程序:gem的了解。(kaminari)
  18. 2011年下半年 系统集成项目管理工程师 下午试卷
  19. IPv4如何向IPv6过渡?IPv6改造方案有哪些?
  20. 自动化测试 | 这些常用测试平台,你们公司在用的是哪些呢?

热门文章

  1. 数值分析-埃特金算法
  2. HTML引入CSS和JavaScript的方式
  3. jQuery(动画,核心函数)
  4. 优秀的Meteor学习资源
  5. Java实习阶段兼生产上线总结
  6. Vue2租车高德地图项目经验分享
  7. 王者荣耀服务器信息共享,王者荣耀账号时长共享怎么使用 账号时长共享使用方法介绍...
  8. 俄侦委:试图劫机的醉酒男子被捕 身上未找到武器
  9. uniapp项目上企业微信应用经历
  10. Node.js+mongodb 学习笔记(三)swagger注释+用户管理