openCV用鼠标单击树莓皮关闭窗口

2024-09-30 10:38:17 发布

您现在位置:Python中文网/ 问答频道 /正文

你会以为我在问这个世界,但我只想让一个用户在openCV窗口中点击closex,然后让程序识别它。在

这似乎并不容易,经过四天的周旋,我发现如何在windows机器上实现这一点,我还没有找到如何使用Python在Raspberry Pi上实现这一点。在

我想我需要获得openCV窗口的句柄(怎么做?)然后用它来查看窗口是否仍然可见(什么调用?)如果不是的话,就停止诉讼(我可以这么做)。在

我尝试过cvGetWindowHandle(“window_name”),但我已经下载了源代码,而GetWindowHandle似乎无法从python获得。在


Tags: 用户name程序机器源代码windows世界pi
3条回答

all I want to do is to have a user click the close X in an openCV window

在这个循环中,它是如何被循环捕获的:

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。使用此选项可以立即中断循环(如果不在循环中,则关闭窗口)。在

参考文献:

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

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

有一个关于如何使用button click事件here的教程,这是我学习该代码的地方,它提供了一个完整的python工作示例。在

但是,您可能在Rpi上运行一个基于unix的系统,因此需要读取This answer,因为您需要一个{}的组合才能工作。在

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

1)找到OpenCV窗口的X11窗口句柄,如here

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

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

更新

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

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

相关问题 更多 >

    热门问题