【发布时间】:2018-05-26 08:47:24
【问题描述】:
我正在使用自编译的 OpenCv 3.3,并在 Windows 7 上启用了 OPENGL 和 CUDA。
我无法以全屏模式显示没有任何边框的图像。 我使用以下最小示例进行测试:
// Name of window
std::string name = "Test Window";
// Create window
cv::namedWindow(name, CV_WINDOW_OPENGL | cv::WINDOW_NORMAL);
cvSetWindowProperty(name.c_str(), CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
// Create a frame at resolution
cv::Size size = cv::Size(1920, 1080);
cv::cuda::GpuMat emptyFrame;
cv::Mat frame(size, CV_8UC(3));
// Fill it in blue
cv::rectangle(frame, cv::Rect(0, 0, size.width, size.height), cv::Scalar(255, 0, 0), CV_FILLED);
emptyFrame.upload(frame);
// Size window to full resolution
cv::resizeWindow(name, size.width, size.height);
while(1)
{
// Display an empty frame
cv::imshow(name, emptyFrame);
cv::waitKey(40);
}
这段代码向我展示了一个以蓝色绘制的全屏窗口,但它在顶部和左侧边框上仍然是一个像素边框: Grey left and top border
边界似乎不是这里解释的边界: https://stackoverflow.com/a/38494752/1570628
其实就是OpenCv创建的主窗口的背景。 深入研究 OpenCv 代码,它有效地在 cvNamedWindow 函数中创建了 2 个窗口:
mainhWnd = CreateWindow( "Main HighGUI class", name, defStyle | WS_OVERLAPPED, rect.x, rect.y, rect.width, rect.height, 0, 0, hg_hinstance, 0 );
if( !mainhWnd )
CV_ERROR( CV_StsError, "Frame window can not be created" );
ShowWindow(mainhWnd, SW_SHOW);
//YV- remove one border by changing the style
hWnd = CreateWindow("HighGUI class", "", (defStyle & ~WS_SIZEBOX) | WS_CHILD, CW_USEDEFAULT, 0, rect.width, rect.height, mainhWnd, 0, hg_hinstance, 0);
if( !hWnd )
CV_ERROR( CV_StsError, "Frame window can not be created" );
所以我们看到的“边框”是 mainhWnd(主 HighGUI 类)颜色。 但是,这意味着我显示的蓝色图像向屏幕的右侧和底部移动了一个像素,因此我在底部和右侧松开了 1 行像素,因为它们溢出了屏幕。
我可以看到是这种情况,因为在双屏幕上,我可以在第二个屏幕上看到右侧的像素溢出线。此外,如果我在图像的最后一行画一条水平线,它不会出现,同样会出现在图像最后一列的垂直线上。
为了测试解决方案,我尝试通过使用多种标志组合直接在 OpenCv 代码中更改 mainhWnd 和 hWnd 的样式,也使用 WS_POPUP 进行测试,但无论如何我总是有这个顶部和左侧边框。
我也在这里尝试了解决方案,但它没有删除边框: https://stackoverflow.com/a/6512315/1570628
有人知道我的问题吗? 问候。
【问题讨论】:
-
经过一番挖掘,我无法找到问题的原因。我在 OpenCv 项目上遇到了这个 Open 问题:github.com/opencv/opencv/issues/4605 所以这似乎是一个长期没有修复的错误。目前,我将 freeGlut 添加到我的项目中,以便将其用于 OpenGL 显示部分:freeglut.sourceforge.net 它运行良好,我没有顶部和左侧边框。我也可以继续使用 OpenCv 来操作 GpuMat。
标签: c++ opencv opengl border imshow