【问题标题】:OpenCV close window with mouse issue出现鼠标问题的 OpenCV 关闭窗口
【发布时间】:2012-04-10 20:28:09
【问题描述】:

OpenCV 2.2 版,C++ 接口。

当在窗口中显示加载的图像时,代码如下:sn-p

cvStartWindowThread();

Mat image;
image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // Read the file

if(! image.data )                              // Check for invalid input
{
    cout <<  "Could not open or find the image" << std::endl ;
    return -1;
}

namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
imshow( "Display window", image );   

while( 1 ) {
    if( cvWaitKey(100) == 27 ) break;
}

我在使用鼠标按close button 而不是使用转义键来关闭图像时遇到问题。

在这种情况下,我的程序将被阻止在while 中,退出它的唯一方法是停止执行,这显然是不希望的。

是否有任何功能可以控制close button 是否被按下? 这样我就可以将它添加到 while 循环中:

例如

while( 1 ) {
    if( cvWaitKey(100) == 27 ) break;
    if( cvCloseButtonPressed == 1) break; <--- purely invented method I'm looking for...
}

【问题讨论】:

    标签: opencv window mouseevent


    【解决方案1】:
    if (!cvGetWindowHandle(windowName.c_str())) {
        destroyAllWindows();
        exit(1);
    }
    

    【讨论】:

    • 添加更多文字,以便读者了解您想要实现的目标。
    【解决方案2】:

    不要循环显示图像,而是只显示一次:

    imshow("Display window", image);
    waitKey(0);
    

    waitKey(0) 表示"wait forever"

    【讨论】:

      【解决方案3】:

      您可以使用cvGetWindowHandle() 函数来获取您命名窗口的句柄。窗口句柄是操作系统特定的功能。 win32 的示例如下所示:

      HWND hwnd = (HWND)cvGetWindowHandle("Display window");
      while(IsWindowVisible(hwnd)) {
          if( cvWaitKey(100) == 27 ) break;
      }
      

      IsWindowVisible() 是一个winapi函数,所以你可能要加上#include &lt;windows.h&gt;

      【讨论】:

      • @MichalKottman 实际上它也可以在带有 g++ 编译器的 linux 上工作,只是语法略有不同。这是我一直在寻找的功能,谢谢!
      • 注意:它似乎不适用于 Windows + MinGW 编译器,由于 Opencv 在 MinGW 上的实现中存在错误?我不知道它什么时候会修复,或者它可能已经修复(因为我不定期更新到最新版本)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      相关资源
      最近更新 更多