Steve
Steve

Reputation: 4097

How to check if an opencv window is closed

How do you check if an opencv window has been closed?

I would like to do:

cvNamedWindow("main", 1);

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

but these is no such cvWindowIsClosed(...) function!

Upvotes: 9

Views: 14514

Answers (6)

Roye Avidor
Roye Avidor

Reputation: 11

Just before the end of the main(), put the following code:

int main(int, char**){
.
.
.

bool visible = true;
while(visible){
        waitKey(1000);
        visible = getWindowProperty("Main",WND_PROP_VISIBLE) > 0;
    }
    return 0;
}

Upvotes: 1

Alex Robinson
Alex Robinson

Reputation: 609

In Python OpenCV version 3.4.2, Ubuntu Bionic, cv2.getWindowProperty('Main', cv2.WND_PROP_VISIBLE) returns a floating 0.0 (zero) when the window is closed and 1.0 (one) when it's open, whether see-able or not. Yes, still a 1.0 when it's minimized or behind another window or on a different desktop.

Upvotes: 2

Derzu
Derzu

Reputation: 7156

You can use the cv::getWindowProperty method.

Do like that:

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

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

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

When the windows be closed the getWindowProperty will return -1.

Upvotes: 3

waas1919
waas1919

Reputation: 2615

This should do

#include <opencv2/opencv.hpp>

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

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

Upvotes: 2

Arindam
Arindam

Reputation: 2176

Suppose you have only one image window open, then clicking the 'x' button at its corner causes the waitkey() function to return a -1 value. Then check if the cvGetWindowHandle("name_of_the_window") function returns 0 or not. If it does return 0, then the window is actually closed. I have tested it in OpenCV3. But I am still not very clear on the reason why the waitkey() return -. I will much appreciate if anyone explains why this happens. [I don't know if my answer to this question will be relevant or not after such a long time. But hopefully if anyone else gets stuck with the same issue (like me), this answer might help them out.] Thanks.

Upvotes: 3

karlphillip
karlphillip

Reputation: 93468

What you are trying to do can be achieved with cvGetWindowHandle():

The function cvGetWindowHandle returns the native window handle (HWND in case of Win32 and GtkWidget in case of GTK+). [Qt Backend Only] qt-specific details: The function cvGetWindowHandle returns the native window handle inheriting from the Qt class QWidget.

The idea is to get the handle of the window and then use specific platform API functions to check if that handle is still valid.

EDIT:

Or you could use the tradicional cvWaitKey() approach:

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

   // display frame

   exit_key_press = cvWaitKey(10);
}

Upvotes: 9

Related Questions