我想在全屏无边框窗口中以OpenCV显示图像。 换句话说,只显示图像像素,没有菜单,工具栏或窗口背景。
使用imshow()
或cvShowImage()
不启用它:
我认为问题源于cvNamedWindow()
方法,该方法会创建主WS_OVERLAPPED
窗口,然后创建一个子项,所有函数如imshow()
或cvGetWindowHandle()
都会对子项进行操作
因此即使是windows命令:
SetWindowLong((HWND)cvGetWindowHandle(winName), GWL_STYLE, WS_VISIBLE | WS_EX_TOPMOST | WS_POPUP);
没有帮助,因为孩子无法成为无国界WS_POPUP
。有人找到了解决方法吗?
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);
答案 0 :(得分:15)
您是否已发出cvShowImage()
来显示该窗口?因为看起来你没有这样做。无论如何,您可能希望为此调用win32 API,因此在ShowWindow(hwnd, SW_SHOW);
之后添加对SetWindowPos()
的调用。
如果您当前拨打SetWindowPos()
的电话无效,请查看以下答案:Hide border of window, if i know a handle of this window
我建议您先完成测试而不先调用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);
在我的系统上,它会准确显示您在问题上提出的问题。