【问题标题】:OpenCV to close the window on a specific key?OpenCV关闭特定键的窗口?
【发布时间】:2020-09-25 09:44:54
【问题描述】:

看起来很简单,但我无法让它工作,也找不到关于这个特定问题的任何问题(如果有,请在 cmets 中指出)。

我正在显示一个图像并希望窗口在特定键上关闭,但奇怪的是,任何键都会导致它关闭

这是我的简单测试代码:

img = cv2.imread("MyImage.png")
cv2.imshow('My Image', img)
k = cv2.waitKey(0) & 0xFF
print(k)
if k == 27:  # close on ESC key
    cv2.destroyAllWindows()

(根据here所说的话)

无论我按什么键,都会显示键码(ESC 为 27,SPACE 为 32,...)并且窗口关闭。

主要问题:永远无法到达if 子句(我通过将print(k) 放入其中进行检查,但没有打印任何内容)。按键后,程序只是停止运行,并且不会检查键码。

(我在 macOS Catalina 上,使用 Python 3.8)

那么,我实际上如何让它等待特定的键?

【问题讨论】:

  • 如果显示的代码就是一切,您的程序结束,因此所有窗口都将关闭。例如,围绕关键读数放置一些循环。
  • 我刚刚在我的电脑上试了一下,效果很好:/
  • @HansHirse,你完全正确!我用waitKey(0) 添加了一个无限循环,它运行得很好!虽然,我很惊讶为什么上面的代码似乎对某些人有用? (也可以发表您的评论作为答案,所以我接受)

标签: python image opencv window


【解决方案1】:

在我看来,您的程序只是终止了,因此所有窗口都被隐式关闭,无论您按哪个键。

一个想法可能是围绕读取和检查按下的键放置一个while True 循环:

import cv2

img = cv2.imread('path/to/your/image.png')
cv2.imshow('My Image', img)
while True:
    k = cv2.waitKey(0) & 0xFF
    print(k)
    if k == 27:
        cv2.destroyAllWindows()
        break

运行这个,按一些键,最后是 ESC,我得到以下输出:

103
100
102
27

此外,所有窗口都关闭,程序终止。

----------------------------------------
System information
----------------------------------------
Platform:     Windows-10-10.0.16299-SP0
Python:       3.8.5
OpenCV:       4.4.0
----------------------------------------

【讨论】:

  • 我用更简单的while cv2.waitKey(0) != 27: pass 做了基本相同的事情,但你的想法是正确的。谢谢。
  • 按键时看到数字,但图像窗口没有关闭。
【解决方案2】:

只需这样做:

img = cv2.imread("MyImage.png")
cv2.imshow('My Image', img)
k = cv2.waitKey(0)
print(k)
if k == 27:  # close on ESC key
    cv2.destroyAllWindows()

我只是从中删除了& 0xFF。这对我有用,但我不知道为什么这会造成问题,因为它只是使用FF 应用和操作。

【讨论】:

  • 它在我的机器上没有任何区别。有或没有0xFF 的行为相同
【解决方案3】:

试试这个,它会等待'q'键被按下。

import cv2

img = cv2.imread("MyImage.png")
cv2.imshow('My Image', img)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

喂。

【讨论】:

  • 没有帮助。仍然关闭任何按键。有趣的是,当我在上面的if 中添加print('sth') 时,它不会运行并且不打印任何东西就存在。
【解决方案4】:

如果你想使用特定的密钥,你可以使用ord()

img = cv2.imread('path/to/your/image.png')
cv2.imshow('My Image', img)

while True:
    k = cv2.waitKey(0) & 0xFF
    print(k)
    if k == ord('c'): # you can put any key here
        cv2.destroyAllWindows()
        break

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 2021-04-08
    • 2013-04-08
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多