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
那么它做了什么:
总帧
。我不想那样
相反,我需要一个执行以下操作的代码:
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
在Pythoncv2
模块中不可用)
所以我到处玩,这就是它的工作原理:
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()