OpenCV Python:如何检测窗口是否关闭?

des*_*ris 13 python opencv

我有以下代码:

total_frames = 50
cv2.cv.NamedWindow("Dragonfly Simulation")
cv2.cv.StartWindowThread()
for i in range(total_frames):
    # do stuff
    img_name = # something
    img = cv2.cv.LoadImage(img_name)
    cv2.cv.ShowImage("Dragonfly Simulation", img)
    cv2.cv.WaitKey(2)
cv2.cv.DestroyWindow("Dragonfly Simulation")
cv2.cv.WaitKey(1)
# rest of code
Run Code Online (Sandbox Code Playgroud)

那么它做了什么:

  1. 打开一个窗口
  2. 在循环中,在窗口上显示图像
  3. 完成后,关闭窗口
  4. 运行其余代码

但是在这种情况下,我有total_frame之前给出的.我不希望这样.

相反,我想要一个执行以下操作的代码:

  1. 打开一个窗口
  2. 在循环中,在窗口上显示图像
  3. 等待用户关闭该窗口
  4. 当用户关闭该窗口时,退出循环,继续执行其余代码.

但是,我在OpenCV中找不到可以检测用户何时关闭窗口的函数.有人可以建议一个解决方法吗?

Sim*_*sch 30

我正在寻找一种方法X,除了等待按键之外,还使用窗口按钮检测窗口何时关闭,但我无法在任何地方找到答案(IsWindowVisible并且cvGetWindowHandle在Python cv2模块中不可用).

所以我玩了,这是它的工作原理:

while cv2.getWindowProperty('window-name', 0) >= 0:
    keyCode = cv2.waitKey(50)
    # ...
Run Code Online (Sandbox Code Playgroud)

cv2.getWindowProperty()-1窗口关闭后立即返回.


有关解释,请参阅枚举文档cv::WindowPropertyFlags:获取带有索引的标志0是全屏属性,但实际上使用哪个标志并不重要,它们都会-1在窗口关闭后立即生效.

  • 这对我不起作用,因为 >= 捕获窗口不可见状态。我用了这个: ```python while cv2.getWindowProperty(name, cv2.WND_PROP_VISIBLE) > 0: keyCode = cv2.waitKey(50) else: print('break') ``` (3认同)
  • 您使用哪个操作系统?我无法让它在 Ubuntu 上运行;即使窗口已关闭,“getWindowProperty”始终返回“0.0”。 (2认同)

小智 14

从版本2.2开始,有一个简单的解决方案(这是从hist.py中的循环修改):

    cv2.imshow('image',im)
    while True:
        k = cv2.waitKey(100) # change the value from the original 0 (wait forever) to something appropriate
...
        elif k == 27:
            print('ESC')
            cv2.destroyAllWindows()
            break        
        if cv2.getWindowProperty('image',cv2.WND_PROP_VISIBLE) < 1:        
            break        
    cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)


Der*_*rzu 5

我使用 getWindowProperty('image', WND_PROP_VISIBLE) 在 C++ 上进行了测试,但它不起作用。所以我使用了 WND_PROP_AUTOSIZE 并且它有效。

我是这样的:

cv::namedWindow("myTitle", WINDOW_AUTOSIZE);

while(1)
{
    cv::imshow("myTitle", myImage);


    if (cv::getWindowProperty("myTitle", WND_PROP_AUTOSIZE) == -1)
        break;
}
Run Code Online (Sandbox Code Playgroud)