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

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

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

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

我认为问题根源于cvNamedWindow()方法,它创建了主WS_OVERLAPPED窗口,然后创建了一个子imshow() ,所有函数如imshow()cvGetWindowHandle()在子cvGetWindowHandle()运行。

因此即使是windows命令:

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

没有帮助,因为孩子不能成为无边界的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); 

你发布了cvShowImage()来显示窗口吗? 因为看起来你没有这样做。 无论如何,您可能想要为此调用win32 API,因此添加对ShowWindow(hwnd, SW_SHOW);的调用ShowWindow(hwnd, SW_SHOW);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"); 

这段代码将使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); 

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