OpenCV Python:如何检测窗口是否关闭?

新手上路,请多包涵

我有以下代码:

 total_frames = 50
cv2.cv.NamedWindow("Dragonfly Simulation")
cv2.cv.StartWindowThread()
for i in range(total_frames):
    # do stuff
    img_name = # something
    img = cv2.cv.LoadImage(img_name)
    cv2.cv.ShowImage("Dragonfly Simulation", img)
    cv2.cv.WaitKey(2)
cv2.cv.DestroyWindow("Dragonfly Simulation")
cv2.cv.WaitKey(1)
# rest of code

那么它做了什么:

  1. 打开一个窗口
  2. 在循环中,在窗口上显示图像
  3. 完成后,关闭窗口
  4. 运行其余代码

但是在这种情况下,我有之前给出的 total_frame 。我不想要那个。

相反,我想要一个执行以下操作的代码:

  1. 打开一个窗口
  2. 在循环中,在窗口上显示图像
  3. 等待用户关闭该窗口
  4. 当用户关闭该窗口时,退出循环,继续执行其余代码。

但是,我在 OpenCV 中找不到可以检测用户何时关闭窗口的函数。任何人都可以提出解决方法吗?

原文由 dessskris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

我只是在寻找一种方法来检测何时使用窗口的 X 按钮关闭窗口,除了等待按键之外,但我无法在任何地方找到答案( IsWindowVisiblecvGetWindowHandle 在Python中不可用 cv2 模块)。

所以我玩了一下,这就是它的工作原理:

 while cv2.getWindowProperty('window-name', 0) >= 0:
    keyCode = cv2.waitKey(50)
    # ...

cv2.getWindowProperty() 返回 -1 一旦窗口关闭。


有关解释,请参阅枚举的文档 cv::WindowPropertyFlags :getting the flag with index 0 is the fullscreen property,但实际上使用哪个标志并不重要,它们都成为 -1 窗口关闭后。


注意:这可能只适用于某些 GUI 后端。值得注意的是,它不适用于 Debian/Ubuntu 软件包中使用的 GTK 后端。要改为使用 Qt 后端,您必须通过 pip 安装 opencv-python

原文由 Simon Hänisch 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 2.2 版开始,有一个简单的解决方案(这是从 hist.py 中的循环修改而来的):

     cv2.imshow('image',im)
    while True:
        k = cv2.waitKey(100) # change the value from the original 0 (wait forever) to something appropriate
...
        elif k == 27:
            print('ESC')
            cv2.destroyAllWindows()
            break
        if cv2.getWindowProperty('image',cv2.WND_PROP_VISIBLE) < 1:
            break
    cv2.destroyAllWindows()

原文由 David Kohen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏