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

您所在的位置:网站首页 gta5caps按了会退出 OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)

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

2024-01-21 04:36| 来源: 网络整理| 查看: 265

提示:阅读文章,大约需要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是代表“永远”的特殊值。

.


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3