Как отобразить изображение в полноэкранном окне без полей в openCV - PullRequest
9 голосов
/ 28 июня 2011

Я хочу отобразить изображение в OpenCV в полноэкранном окне без полей. Другими словами, будут отображаться только пиксели изображения без меню, панели инструментов или фона окна.

Используя imshow() или cvShowImage(), не включайте его:

  1. Окно становится полноэкранным по ширине, но не по высоте. Он пропускает несколько пикселей.
  2. Я не смог сделать его без полей, даже изменив настройки окна Обработчик.

Я думаю, что проблема кроется в методе cvNamedWindow(), который создает главное окно WS_OVERLAPPED, затем создает дочерний элемент, и все функции, такие как imshow() или cvGetWindowHandle(), работают с дочерним элементом.

Таким образом, даже команда windows:

SetWindowLong((HWND)cvGetWindowHandle(winName), GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP);

Не помогает, так как ребенок не может стать без границ WS_POPUP. Кто-то нашел обходной путь?

  • Может быть, показ коврика opencv в окне без использования opencv встроенных методов
  • Или какой-то трюк с окнами

P.S. Я попробовал следующий код:

cvMoveWindow("AAA",0,0);
cvSetWindowProperty("AAA", CV_WINDOW_FULLSCREEN, CV_WINDOW_FULLSCREEN);

// Also I tried this:
HWND hwnd = (HWND)cvGetWindowHandle("AAA");
RECT windowRect;
windowRect.left = 0;
windowRect.top = 0;
windowRect.right = cxScreen; //Display resolution
windowRect.bottom = cyScreen; //Display resolution
AdjustWindowRect(&windowRect,WS_VISIBLE,false);
long p_OldWindowStyle = SetWindowLongPtr(hwnd,GWL_STYLE,WS_POPUP);
SetWindowPos(hwnd,HWND_TOP,0,0,windowRect.right,windowRect.bottom,SWP_FRAMECHANGED | SWP_SHOWWINDOW);
SetWindowLong(hwnd, GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP); 

1 Ответ

15 голосов
/ 28 июня 2011

Вы ввели cvShowImage() для отображения окна?Потому что, кажется, ты этого не делаешь.В любом случае, вы можете вместо этого вызвать Win32 API для этого, поэтому добавьте вызов к ShowWindow(hwnd, SW_SHOW); после SetWindowPos().

Если ваш текущий вызов SetWindowPos() не сработает, отметьте этоответ: Скрыть границу окна, если я знаю дескриптор этого окна

Я рекомендую вам сначала выполнить тесты, не вызывая cvSetWindowProperty(), просто чтобы убедиться, что вы можете найти методэто работает.

Просто обратите внимание, если вы отметите modules/highgui/src/window_w32.cpp, вы увидите, как OpenCV создает окна в Windows.

РЕДАКТИРОВАТЬ :

следующий код реализует советы, которые я дал ранее, и обходит проблемы, о которых сообщил OP.Трюк НЕ использует cvGetWindowHandle() для извлечения дескриптора окна и прямого использования win32 API для этого: FindWindow()

IplImage* cv_img = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(!cv_img)
{
    printf("Failed cvLoadImage\n");
    return -1;
}

cvNamedWindow("main_win", CV_WINDOW_AUTOSIZE);
cvMoveWindow("main_win", 0, 0);
cvSetWindowProperty("main_win", CV_WINDOW_FULLSCREEN, CV_WINDOW_FULLSCREEN);

cvShowImage("main_win", cv_img);

//HWND cv_hwnd = (HWND)cvGetWindowHandle("main_win");
//if (!cv_hwnd)
//{
//  printf("Failed cvGetWindowHandle\n");
//}
//printf("cvGetWindowHandle returned %p\n", *cv_hwnd);

HWND win_handle = FindWindow(0, L"main_win");
if (!win_handle)
{
    printf("Failed FindWindow\n");
}

SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
ShowWindow(win_handle, SW_SHOW);

cvWaitKey(0);

cvReleaseImage(&cv_img);
cvDestroyWindow("main_win");

Этот код сделает окно, созданное OpenCV, без полей, но вам все равно, возможно, придется настроить то или иное, чтобы сделать эту операцию совершенной .Вы поймете, почему.Одна идея состоит в том, чтобы изменить размер окна и сделать его размером изображения.

РЕДАКТИРОВАТЬ :

Ну, так как вы заявили:

написание демо может быть очень трудным

Я также решил сделать эту последнюю часть для вас, поскольку я такой хороший парень =]

Это небольшое улучшениекод выше:

HWND win_handle = FindWindow(0, L"main_win");
if (!win_handle)
{
    printf("Failed FindWindow\n");
}

// Resize
unsigned int flags = (SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
flags &= ~SWP_NOSIZE;
unsigned int x = 0;
unsigned int y = 0;
unsigned int w = cv_img->width;
unsigned int h = cv_img->height;
SetWindowPos(win_handle, HWND_NOTOPMOST, x, y, w, h, flags);

// Borderless
SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
ShowWindow(win_handle, SW_SHOW);

И в моей системе он отображает именно то, что вы задали по вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...