【问题标题】:How to check if an opencv window is closed如何检查opencv窗口是否关闭
【发布时间】:2012-03-08 10:44:52
【问题描述】:

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

我想做:

cvNamedWindow("main", 1);

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

但是这些没有这样的 cvWindowIsClosed(...) 函数!

【问题讨论】:

  • 多年来从未需要过这样的东西。你到底想做什么?很可能还有其他方法可以实现您的目标。
  • @karlphillip 我希望在用户关闭窗口之前渲染新帧。

标签: c++ c opencv


【解决方案1】:

你想做的事可以通过cvGetWindowHandle()来实现:

函数 cvGetWindowHandle 返回本地窗口句柄(在 Win32 的情况下为 HWND,在 GTK+ 的情况下为 GtkWidget)。 [Qt Backend Only] qt 特定细节:函数 cvGetWindowHandle 返回继承自 Qt 类 QWidget 的原生窗口句柄。

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

编辑:

或者您可以使用传统的cvWaitKey() 方法:

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

   // display frame

   exit_key_press = cvWaitKey(10);
}

【讨论】:

    【解决方案2】:

    假设您只打开了一个图像窗口,然后单击其角落的“x”按钮会导致 waitkey() 函数返回 -1 值。 然后检查 cvGetWindowHandle("name_of_the_window") 函数是否返回 0。如果它确实返回 0,那么窗口实际上是关闭的。 我已经在 OpenCV3 中对其进行了测试。 但是我仍然不太清楚waitkey()返回的原因-。如果有人解释为什么会发生这种情况,我将不胜感激。 [我不知道这么长时间后我对这个问题的回答是否有意义。但希望如果其他人遇到同样的问题(比如我),这个答案可能会帮助他们。] 谢谢。

    【讨论】:

      【解决方案3】:

      应该这样做

      #include <opencv2/opencv.hpp>
      
      std::string mTitle = "title of my window";
      
      while (cvGetWindowHandle(mTitle.c_str()))
      {
         // ...
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用 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;
        }
        

        当窗口关闭时,getWindowProperty 将返回 -1。

        【讨论】:

          【解决方案5】:

          在 Python OpenCV 版本 3.4.2、Ubuntu Bionic 中,cv2.getWindowProperty('Main', cv2.WND_PROP_VISIBLE) 在窗口关闭时返回浮动 0.0(零),在窗口打开时返回 1.0(一),无论是否可见。是的,当它被最小化或在另一个窗口后面或在不同的桌面上时,它仍然是 1.0。

          【讨论】:

            【解决方案6】:

            就在 main() 结束之前,输入以下代码:

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

            【讨论】:

              猜你喜欢
              • 2016-05-02
              • 2014-10-23
              • 1970-01-01
              • 1970-01-01
              • 2011-09-10
              • 1970-01-01
              • 2017-09-14
              • 2012-03-11
              相关资源
              最近更新 更多