【问题标题】:OpenCv border top and left OpenGL frame c++OpenCv边框顶部和左侧OpenGL框架c ++
【发布时间】: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 代码中更改 mainhWndhWnd 的样式,也使用 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


【解决方案1】:

嘿,这对我有用(至少在 python 上是这样,因为你只需要更改一个标志,我相信这对你也有用)

将此标志“CV_WINDOW_OPENGL | cv::WINDOW_NORMAL)”更改为该标志“WINDOW_FREERATIO”

瞧!问题解决了

【讨论】:

  • 我测试过它总是显示灰色边框。此外,我不能使用它,因为我使用的是 OPENGL,所以我被 CV_WINDOW_OPENGL 卡住了。我需要一个 Opengl 窗口来显示来自显卡的 4K 视频流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多