[英]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.