如何在openCV中以全屏无边框窗口显示图像

Dan*_*HsH 9 c winapi opencv image

我想在全屏无边框窗口中在OpenCV中显示图像.换句话说,只显示图像像素,没有菜单,工具栏或窗口背景.

使用imshow()cvShowImage()不启用它:

  1. 窗口的宽度增加到全屏但不是高度.它错过了几个像素.
  2. 即使通过更改窗口处理程序的设置,我也无法使其无边界.

我认为问题的根源在于cvNamedWindow()创建主WS_OVERLAPPED窗口的方法,然后创建一个子项以及所有函数imshow()或者cvGetWindowHandle()对子项进行操作.

因此即使是windows命令:

SetWindowLong((HWND)cvGetWindowHandle(winName), GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP);
Run Code Online (Sandbox Code Playgroud)

没有帮助,因为孩子不能无国界WS_POPUP.有人得到了解决方法吗?

  • 也许,在不使用opencv内置方法的情况下向窗口显示opencv mat
  • 或某种窗口技巧

PS我尝试了以下代码:

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); 
Run Code Online (Sandbox Code Playgroud)

kar*_*lip 15

你发布cvShowImage()了显示窗口吗?因为看起来你没有这样做.无论如何,您可能希望为此调用win32 API,因此请添加对ShowWindow(hwnd, SW_SHOW);after 的调用SetWindowPos().

如果您当前的调用SetWindowPos()不起作用,请检查以下答案:隐藏窗口边框,如果我知道此窗口的句柄

我建议你在没有调用的情况下进行测试cvSetWindowProperty(),只是为了确保你能找到一个有效的方法.

只需注意,如果您检查,modules/highgui/src/window_w32.cpp您可以看到OpenCV如何在Windows上创建窗口.

编辑:

以下代码实现了我之前提供的技巧,并绕过了OP报告的问题.诀窍不是cvGetWindowHandle()用来检索windows的句柄并直接使用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");
Run Code Online (Sandbox Code Playgroud)

此代码将使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);
Run Code Online (Sandbox Code Playgroud)

在我的系统上,它会准确显示您在问题上提出的问题.