openCV用鼠标点击Raspberry Pi关闭窗口

时间:2015-06-15 10:47:44

标签: python opencv raspberry-pi

你会认为我要求这个世界,但我想做的就是让用户在openCV窗口中单击关闭X并让程序识别它。

这似乎并不容易,经过四天的循环并了解如何在Windows机器上完成后,我无法在使用Python的Raspberry Pi上找到如何做到这一点。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

1)按照here

所述,找到OpenCV窗口的X11窗口句柄

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

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

<强>更新

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

我的个人建议 - 使用Qt或其他一些GUI友好框架来呈现OpenCV图像,而不是直接使用OpenCV。 OpenCV是一个成像框架,但IMHO highgui对于任何严重的事情都无法使用。

答案 2 :(得分:0)

  

我要做的就是让用户单击openCV中的关闭X   窗口

这是我在捕获循环(RPi拉伸,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。使用此按钮可以立即中断循环(如果不在循环中,则可以关闭窗口)。

参考文献:

答案 3 :(得分:0)

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进行测试。)