问题描述
我要在全屏幕边框窗口来显示在OpenCV的图像。
换言之,只有图像像素将出现,没有菜单,工具栏,或窗口的背景。
使用 imshow()
或 cvShowImage()
不启用:
- 窗口长到全屏
在宽度,但不高。它错过几个像素。 - 我不能让无国界甚至通过改变窗口的设置
处理程序。
我认为问题的根源在于 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。我尝试以下code:
cvMoveWindow(AAA,0,0);
cvSetWindowProperty(AAA,CV_WINDOW_FULLSCREEN,CV_WINDOW_FULLSCREEN);//还有我尝试这样做:
HWND HWND =(HWND)cvGetWindowHandle(AAA);
RECT windowRect;
windowRect.left = 0;
windowRect.top = 0;
windowRect.right = cxScreen; //显示分辨率
windowRect.bottom = cyScreen; //显示分辨率
AdjustWindowRect(安培; windowRect,WS_VISIBLE,FALSE);
长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);
在 SetWindowPos()
。
如果您的当前呼叫 SetWindowPos()
不会做的伎俩,检查这样的回答:Hide窗口的边框,如果我知道这个窗口的句柄
我建议你没有调用 cvSetWindowProperty()
起初,只是为了确保你能找到一个可行的方法。
刚一说明,如果你检查模块/ highgui / src目录/ window_w32.cpp
你可以看到OpenCV的是如何在Windows上创建的窗口。
修改
以下code实现我之前给了提示和绕过OP报告的问题。诀窍是不使用 cvGetWindowHandle()
来检索窗口手柄,直接使用的的win32 的该API: FindWindow函数( )
的IplImage * cv_img = cvLoadImage(test.jpg放在CV_LOAD_IMAGE_UNCHANGED);
如果(!cv_img)
{
的printf(无法cvLoadImage \\ n);
返回-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);
//如果(!cv_hwnd)
// {
//的printf(无法cvGetWindowHandle \\ n);
//}
//输出(cvGetWindowHandle返回%P \\ N,* cv_hwnd);HWND win_handle = FindWindow函数(0,Lmain_win);
如果(!win_handle)
{
的printf(无法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);
这code将使由OpenCV的无边距创建的窗口,但你仍然可能要调整一件事或另一个是让这个操作的完美的。你会看到为什么。一种想法是调整窗口的大小,使其图像的大小。
修改
好吧,既然你说:
I also decided to do this last part for you, since I'm such a nice guy =]
This is a small improvement of the code above:
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);
And on my system it displays exactly what you asked on the question.
这篇关于如何显示在OpenCV的全屏无边框窗口中的图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!