繁体   English   中英

Raspberry Pi 上的 Python OpenCV 检测 window 关闭

[英]Python OpenCV on Raspberry Pi detect window closing

我有一个 Python 应用程序,它使用 OpenCV 来生成一个简单的显示 window。 使用以下代码片段(来自交互式 Python shell):

>>> import cv2
>>> image = cv2.imread("pic.jpg")
>>> image.shape
(653,551,3)
>>> cv2.namedWindow("foo")
>>> cv2.resizeWindow("foo", 300, 300)
>>> cv2.imshow("foo", image)
>>> cv2.getWindowProperty("foo", cv2.WND_PROP_VISIBLE)
1.0
>>> cv2.waitKey(1000)
-1
>>> cv2.getWindowProperty("foo", cv2.WND_PROP_VISIBLE)
1.0
>>> cv2.waitKey(1000)
-1
>>> cv2.getWindowProperty("foo", cv2.WND_PROP_VISIBLE)
0.0

When I run this from a Linux desktop system (Xubuntu 18.04 LTS, Python 3.6.9, cv2 version 4.5.1), I see a window appear on screen immediately after calling cv2.namedWindow and the VISIBLE property is immediately true, even before I调用waitKey waitKey调用之后,我看到 window 调整大小并且图像可见。

当我单击窗口的关闭框(在第二次调用getWindowProperty之后)然后调用waitKey时,window 关闭并且 VISIBLE 属性现在为 0。

这一切都很好,因为我还没有真正销毁 window。

但是,当我在 Raspberry Pi(Raspbian/Debian 版本 10.8、Python 3.7.3、cv2 版本 4.5.1)上尝试相同的操作时,VISIBLE 属性始终返回 -1.0,两者都在waitKey出现之前(第一个调用) , 虽然它是可见的,并且在它关闭之后(在第二次waitKey调用之后)。

如果我查看 Pi 上的其他 window 属性,我发现属性 0、1 和 2(FULLSCREEN、AUTOSIZE 和 ASPECT_RATIO)给了我有效值,直到 window 关闭,所有其他属性(包括 VISIBLE)在一直。 window关闭后,0抛出异常,其他属性返回-1.0。

更有趣的是,在 Ubuntu/Xfce 桌面上,当 window 打开或关闭时,属性 0-3 不会改变,因此在该平台上检查它们肯定不起作用。

这里发生了什么? 为什么我的桌面环境表现如此不同?

它是 window 管理器(Xfce 与 Lxde)的 function 吗? Pi 上是否缺少我可以添加以更改行为的软件包(我没有收到有关 cv2 无法加载任何内容的消息)?

什么是好的解决方案? 更改我的代码以以不同的方式检查窗口关闭? 使用不同的属性(1 或 2)作为解决方法并忘记问题? 还有什么?

我很快得出结论,这一定是 OpenCV 的 Raspberry Pi 版本中的错误。 这是我目前正在使用的一种解决方法,它似乎可以在 Pi 和桌面 Linux 系统上执行我想要的操作:

if ((cv2.getWindowProperty("foo", cv2.WND_PROP_VISIBLE) == 0)
    or
    (cv2.getWindowProperty("foo", cv2.WND_PROP_ASPECT_RATIO) < 0)):
   # The window is closed - do something here

在此解决方法中,我检查了两个属性。 在两个平台上,当 window 打开时,VISIBLE 属性为非零(在 Raspberry Pi 上为 -1,在桌面 Linux 上为 1)并且 ASPECT_RATIO 属性大于 0。

当 window 关闭时,VISIBLE 属性在桌面 Linux 系统上变为零,而 ASPECT_RATIO 在 Raspberry Pi 上变为 -1。

这是一种解决方法,而不是解决方案,但它有效(至少目前如此)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM