2012-02-17 46 views
7

如何检查opencv窗口是否已关闭?如何检查opencv窗口是否关闭

我想这样做:

cvNamedWindow("main", 1); 

while(!cvWindowIsClosed("main")) 
{ 
    cvShowImage("main", myImage); 
} 

但这些是没有这样的cvWindowIsClosed(...)的功能!

+0

多年来从未需要这样的东西。你到底想做什么?很可能还有其他一些方法可以实现您的目标。 – karlphillip 2012-02-17 01:14:07

+0

@karlphillip我正在寻找新的框架,直到用户关闭窗口。 – Steve 2012-02-17 01:47:40

回答

7

你正在尝试做可以cvGetWindowHandle()实现:

功能cvGetWindowHandle返回本地窗口句柄(HWND在Win32和的GtkWidget的情况下,GTK +的情况下)。 [仅限Qt后端]特定于qt的细节:函数cvGetWindowHandle返回从Qt类QWidget继承的本地窗口句柄。

这个想法是获取窗口的句柄,然后使用特定的平台API函数来检查该句柄是否仍然有效。

编辑:

或者你可以使用tradicional cvWaitKey()方法:

char exit_key_press = 0; 
while (exit_key_press != 'q') // or key != ESC 
{ 
    // retrieve frame 

    // display frame 

    exit_key_press = cvWaitKey(10); 
} 
+0

@Steve更新了答案。 – karlphillip 2012-02-17 12:03:48

2

假设你只有一个形象窗口打开,然后点击“X”按钮,在其一角使waitkey ()函数返回-1值。 然后检查cvGetWindowHandle(“name_of_the_window”)函数是否返回0。如果它返回0,那么窗口实际上是关闭的。 我已经在OpenCV3中测试过它。 但我仍然不清楚waitkey()返回的原因。如果有人解释为何发生这种情况,我将非常感激。 [我不知道在这么长时间之后,我对这个问题的回答是否相关。但希望如果其他人陷入同样的​​问题(像我一样),这个答案可能会帮助他们。] 谢谢。

1

这应该做

#include <opencv2/opencv.hpp> 

std::string mTitle = "title of my window"; 

while (cvGetWindowHandle(mTitle.c_str())) 
{ 
    // ... 
} 
0

可以使用CV :: getWindowProperty方法。

做这样的:

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

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

    // add this IF. 
    if (cv::getWindowProperty("main", WND_PROP_AUTOSIZE) == -1) 
     break; 
} 

当Windows关闭的getWindowProperty将返回-1。