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

OpenCV Python:如何检测窗口是否关闭?,python,opencv,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",

我有以下代码:

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
那么它做了什么:

  • 打开一个窗口
  • 在循环中,在窗口上显示图像
  • 完成后,关闭窗口
  • 运行其余的代码
  • 但是,在这种情况下,我有前面给出的
    总帧
    。我不想那样

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

  • 打开一个窗口
  • 在循环中,在窗口上显示图像
  • 等待用户关闭该窗口
  • 当用户关闭该窗口时,退出循环将继续执行其余代码
  • 然而,我在OpenCV中找不到一个可以检测用户何时关闭窗口的函数。有人能提出一个解决办法吗

    import cv2
    import numpy as np
    
    # total_frames = 50
    cv2.namedWindow("Dragonfly Simulation")
    cv2.startWindowThread()
    # for i in range(total_frames):
    while True:
        # do stuff
        img = np.random.randint(0,255,(200,300)).astype(np.uint8)
        cv2.imshow("Dragonfly Simulation", img)
        key = cv2.waitKey(200)
        print key
        if key in [ord('a'), 1048673]:
            print 'a pressed!'
        elif key in [27, 1048603]: # ESC key to abort, close window
            cv2.destroyAllWindows()
            break
    
    # do the rest of processing after break 
    print 'results:'
    
    当然,您可以使用
    waitKey
    检查用户输入,下面是一个基于您的代码的小示例。我将旧的cv界面更改为cv2。我认为简历已经过时了


    (编辑)我将cv2.destroyAllWindows()移动到while循环内部,以明确当用户按下ESC键时窗口关闭(您可以指定您选择的键)。我不认为opencv有一个合适的事件处理程序来捕捉窗口关闭事件,就像在其他GUI工具包(wxPython等)中一样。因此,您需要定义用户应如何关闭窗口并注意这一点。

    除了等待按键外,我只是想通过窗口的
    X
    按钮来检测窗口何时关闭,但我在任何地方都找不到答案(
    IsWindowVisible
    cvGetWindowHandle
    在Python
    cv2
    模块中不可用)

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

    while cv2.getWindowProperty('window-name', 0) >= 0:
        keyCode = cv2.waitKey(50)
        # ...
    
    cv2.getWindowProperty()
    在窗口关闭后立即返回
    -1



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

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

    cv2.imshow('image',im)
    尽管如此:
    k=cv2.waitKey(100)#将值从原来的0(永远等待)更改为合适的值
    ...
    elif k==27:
    打印('ESC')
    cv2.destroyAllWindows()
    打破
    如果cv2.getWindowProperty('image',cv2.WND_PROP_可见)<1:
    打破
    cv2.destroyAllWindows()
    

    我使用GETWOWDOWAY属性(“图像”,WNDYPROPARICANTIONE)在C++上测试,但它不起作用。所以我使用WNDYPROPUAZEFSIZE,它工作。< /P> 我喜欢这样:

    cv::namedWindow("myTitle", WINDOW_AUTOSIZE);
    
    while(1)
    {
        cv::imshow("myTitle", myImage);
    
    
        if (cv::getWindowProperty("myTitle", WND_PROP_AUTOSIZE) == -1)
            break;
    }
    

    我使用了以下代码t检查是否同时按下了一个键或车窗是否关闭

        while cv2.getWindowProperty(camera.get_name(), cv2.WND_PROP_VISIBLE) > 0:
            if cv2.waitKey(100) > 0:
                break
    
        cv2.destroyAllWindows()
    

    也许您可以捕获一些异常?例如,请尝试访问窗口,如果它在NowInowExistsException/NullPointerException中失败,请使用您的代码。@jotto umm,对不起,我是OpenCV的新手,如何检查异常?使用我当前的代码,如果关闭窗口,代码将停止。另外,从ShowImage的手册:“如果该窗口不是在此函数之前创建的,则假定创建的窗口具有CV\u window\u AUTOSIZE"我对OpenCV一点也不熟悉。我只是认为关闭窗口后实例会保留下来。也许这就是您要寻找的?全局存储cv的一些引用,以便无论窗口是否关闭,您都可以访问它?我只是猜测。@jotto umm我正在模拟神经元模拟,所以我想运行模拟,以作为参考ng根据用户需要(而不是指定的持续时间或帧数)。因此,想要检测用户何时关闭此类窗口。我想我也可以检测键盘按下?但不完全确定如何做…您可以在循环过程中关闭窗口吗?@Desskris,这就像我想让您建议的一样。是的,您的解决方案可以工作,但不幸的是,会将“OpenCV错误:空指针”写入stderr(空窗口)在cvGetModeWindow_GTK中,文件/build/opencv SviWsf/opencv-2.4.9.1+dfsg/modules/highgui/src/window_GTK.cpp,第555行“Python中的VLADYSLavaSkjkO或C++中的Python没有任何错误,我也使用OpenCV版本3.1……你可以尝试在catch语句中用Test/catch捕获并退出它。是的,在Python中,尝试.ccatch不能帮助,因为OpenCV写入STDRR而不是抛出任何Python异常。(但别在意,我已经在wx上重写过了:))。谢谢您的帮助!您使用的是哪种操作系统?我无法在Ubuntu上运行此操作;
    getWindowProperty
    始终返回
    0.0
    ,即使窗口已关闭。这对我不起作用,因为>=捕捉到窗口不可见的状态。我使用的是:
    python而cv2.getWindowProperty(名称,cv2.WND_PROP_可见)>0:keyCode=cv2.waitKey(50)else:print('break'))
    您的答案只是代码,请尝试添加对文档的引用或解释它的作用。虽然有时您需要回答的核心问题是一些代码,但越详细越好。在python中也适用:
    cv2.imshow(“image”,image)if cv2.getWindowProperty('image',1)<0:break
    其中
    cv2.getWindowProperty(,1)
    指的是自动调整大小标志[
    cv::namedWindow("myTitle", WINDOW_AUTOSIZE);
    
    while(1)
    {
        cv::imshow("myTitle", myImage);
    
    
        if (cv::getWindowProperty("myTitle", WND_PROP_AUTOSIZE) == -1)
            break;
    }
    
        while cv2.getWindowProperty(camera.get_name(), cv2.WND_PROP_VISIBLE) > 0:
            if cv2.waitKey(100) > 0:
                break
    
        cv2.destroyAllWindows()