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

2024-09-24 00:33:58 发布

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

我有以下代码:

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

那么它的作用是什么:

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

但是在这种情况下,我有前面给出的total_frame。我不想那样。

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

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

但是,我在OpenCV中找不到一个函数可以检测用户何时关闭窗口。有人能提出解决办法吗?


Tags: 代码用户name图像imgforframescv2
3条回答

从版本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()

我使用GETWOWOWORD属性(“图像”,WNDYPROPARICANTIONE)在C++上测试,但它不起作用。所以我用了WND_PROP_AUTOSIZE,它很管用。

我确实喜欢这样:

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

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


    if (cv::getWindowProperty("myTitle", WND_PROP_AUTOSIZE) == -1)
        break;
}

我只是在寻找一种方法,除了等待按键之外,还可以使用窗口的X按钮检测窗口何时关闭,但在任何地方都找不到答案(IsWindowVisiblecvGetWindowHandle在Pythoncv2模块中都不可用)。

所以我到处玩,这就是它的工作原理:

while cv2.getWindowProperty('window-name', 0) >= 0:
    keyCode = cv2.waitKey(50)
    # ...

只要窗口关闭,cv2.getWindowProperty()就返回-1


有关解释,请参阅^{}枚举的文档:获取索引为0的标志是全屏属性,但实际上,使用哪个标志并不重要,只要关闭窗口,它们都会变成-1

相关问题 更多 >