如何检测 OpenCV 中何时释放密钥?

Posted

技术标签:

【中文标题】如何检测 OpenCV 中何时释放密钥?【英文标题】:How to detect when a key is released in OpenCV? 【发布时间】:2020-01-27 01:43:34 【问题描述】:

如果我运行以下代码

import cv2

cv2.namedWindow('Window')
while True:
    key = cv2.waitKey(50)
    print(key)
    if key == ord('q'):
        break
print('quit')

然后按i(键码105)一会儿,我得到了输出

-1
-1
-1
-1
-1
-1
105
-1
-1
-1
-1
-1
-1
-1
-1
-1
105
105
105
105
105
105
105
105
105
105
-1
-1

105 第一次出现是我按下i 的时间。即使我一直按下i,我还是连续九次得到-1。然后我不断得到105,直到我释放i

在第一次出现105 后,我如何知道i 在这两种情况下都被按下时还是被释放了-1?或者换句话说,您如何检测 OpenCV 中何时释放了某个键?

【问题讨论】:

opencv 的用户界面非常简陋。使用一些“真实”的 ui 框架来实现附加功能。 【参考方案1】:

OpenCV 有一个非常基本的接口属性。正如the documentation 提到的,它没有谈论发布的事件:

函数waitKey无限期地等待一个按键事件(当 ?????≤0 )或延迟毫秒,当它为正时。自从 操作系统在切换线程之间有最短时间,该函数将 不完全等待延迟毫秒,它将至少等待延迟毫秒,具体取决于 那时您的计算机上还运行着什么。它返回 按下的键的代码或 -1 如果在之前没有按下任何键 指定时间已过。

在您的情况下,如果您只使用按下事件,它将正常工作。不幸的是,您无法使用按下事件获得释放事件。您可以使用MouseEvent types 而不是 keyEvent 来进行发布事件,或者像评论中提到的 Micka 一样,最好使用基于 ui 的程序。

【讨论】:

以上是关于如何检测 OpenCV 中何时释放密钥?的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D:如何检测按钮何时被按住和释放[重复]

如何在 Flutter 插件中添加 OpenCV

有没有人在 OpenCV 中使用 MSER 来检测区域?

GetKeyState() 是不是检测到密钥是不是被释放?

Opencv 3.0 加载人脸级联时出错

OpenCV与EmguCV中的图像轮廓提取