OpenCV关闭窗口,鼠标点击树莓派



我想做的是,我想让用户在OpenCV窗口中单击关闭"X"按钮,让程序识别它,然后关闭该窗口。

这似乎并不容易,经过四天的兜圈子并找出如何在Windows机器上完成它之后,我并没有更接近于了解如何使用Python在Raspberry Pi上做到这一点。

我想我需要获取OpenCV窗口的句柄(如何?),然后使用它来查看窗口是否仍然可见(什么调用?),如果不是,则停止程序(我可以这样做)。

我已经尝试了cvGetWindowHandle("window_name"),但是我已经下载了源代码,并且GetWindowHandle似乎无法从python获得。

捕获鼠标左键单击事件并关闭窗口的代码相当简单:

if event == cv2.EVENT_LBUTTONDOWN:
    cv2.destroyWindow("window_name")

这里有一个关于如何使用按钮单击事件的教程,这是我获取该代码的地方,它提供了一个完整的 python 工作示例。

但是,您可能正在 rpi 上运行基于 unix 的系统,因此需要阅读 这个答案,因为您需要waitKey(1)的组合才能使其工作。

我可能有一个解决方案,但我不是 100% 确定,所以你必须自己检查一下:)我假设OpenCV在下面使用X11(如果没有,这些都没有意义)。使用 X11,您可以:

1) 查找 OpenCV 窗口的 X11 窗口句柄,如此处所述

2) 使用 XSelectInput 挂接到其事件循环,有点类似于此处所做的。我假设您应该使用StructureNotifyMask作为掩码来获取XDestroyWindowEvent事件。运行 X11 事件循环,一旦获得相应的事件,就可以调用 OpenCV destroyWindow 函数。

这个建议是基于假设的,我不能保证它会起作用,但据我所知,如果 OpenCV 不是用其他特定的窗口管理器构建的,这应该可以工作。据我了解,Raspbian 在某个时候与 X11 一起发货,然后它切换到 Wayland。如果你有一个带有Wayland的图像,那么这可能行不通(我很抱歉,但我的Linux技能不包含如何确定使用哪一个的秘诀:D)。

更新

实际上,经过更多的阅读,我似乎觉得 gtk 应该能够处理 (X11/Wayland) 下面使用的任何东西。因此,如果您安装了 gtk 开发库,您还应该能够连接到 Windows 删除信号,如此处所述。然后,唯一的问题仍然是如何获取窗口句柄。

我个人的建议 - 使用Qt或其他GUI友好的框架来渲染OpenCV图像,而不是直接使用OpenCV进行渲染。OpenCV是一个成像框架,但恕我直言,highgui对于任何严肃的事情来说都太无法使用了。

我只想让用户在打开的CV中单击关闭的X 窗

这就是我在捕获循环(RPi stretch,opencv 4.0)中的做法:

while True: 
    # do your video capture
    # ... 
    cv.imshow("video frame",frame)
    if cv.getWindowProperty('video frame', 1) < 0:
        break

getWindowProperty没有太多文档,但顾名思义,它的作用是返回给定窗口的属性。其中两个感兴趣的标志是WND_PROP_FULLSCREEN(或 0)和WND_PROP_AUTOSIZE(或 1)。当窗口关闭时,函数返回 -1。使用它可以立即中断循环(如果不在循环中,则关闭窗口)。

引用:

  • https://docs.opencv.org/3.1.0/d7/dfc/group__highgui.html#gaaf9504b8f9cf19024d9d44a14e461656
  • OpenCV Python:如何检测窗口是否关闭?

cv2.getWindowImageRect(windowName)投票。当用户单击窗口关闭按钮时,它将返回 (-1, -1, -1, -1)。

# check if window was closed or image was resized
xPos, yPos, width, height = cv2.getWindowImageRect(windowName)
if xPos == -1: # if user closed window
    pass # do whatever you want here if the user clicked CLOSE

我没有在任何地方找到这个记录;在处理窗口大小调整时偶然发现了它。(使用 OpenCV 4.1.0 测试。

相关内容

  • 没有找到相关文章

最新更新