OpenCV закрыть окно с проблемой мыши - PullRequest
3 голосов
/ 27 марта 2012

OpenCV версии 2.2, интерфейс C ++.

При отображении загруженного изображения в окне со следующим фрагментом кода

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 возникает проблемас помощью мыши вместо клавиши ESC.

В этом случае моя программа будет заблокирована в while, и единственный способ выйти из нее - остановить выполнение, что, очевидно, нежелательно.

Есть ли какая-либо функция, которая управляет нажатием close button?Таким образом, я мог бы добавить его в цикл while следующим образом:

Например,

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

Ответы [ 3 ]

10 голосов
/ 27 марта 2012

Вы можете использовать функцию cvGetWindowHandle(), чтобы получить дескриптор вашего именованного окна. Описатель окна - это особенность ОС. Пример для win32 выглядит так:

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

IsWindowVisible () - это функция winapi, поэтому вы можете добавить #include <windows.h>

2 голосов
/ 27 марта 2012

Вместо показа изображения в цикле, попробуйте показать его только один раз:

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

waitKey(0) означает «ждать вечно» .

0 голосов
/ 16 августа 2017
if (!cvGetWindowHandle(windowName.c_str())) {
    destroyAllWindows();
    exit(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...