OpenCV 3.3 OpenGL全屏模式下顶部左侧1像素边框问题求助
解决OpenCV 3.3(OpenGL+CUDA)全屏显示时顶部/左侧1像素边框问题
我在Windows 7系统上使用自行编译的、启用OpenGL与CUDA的OpenCV 3.3版本,目前遇到了一个棘手的问题:全屏显示图像时,顶部与左侧始终存在1像素的灰色边框。这个边框并不是常规的窗口边框,而是OpenCV创建的主窗口(mainhWnd)的背景色,同时导致显示的图像向右下偏移了1像素——屏幕右下侧的1行/列像素会溢出丢失,双屏环境下右侧像素还会跑到副屏上,图像最后一行/列的线条完全无法显示。
我写了一段最简测试代码来复现问题:
// 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); }
运行这段代码后,全屏窗口显示蓝色,但顶部和左侧的1像素灰色边框依然存在。我查看了OpenCV的源码,发现cvNamedWindow函数会创建两个窗口:
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" );
我尝试过直接修改OpenCV源码中mainhWnd与hWnd的窗口样式(包括组合使用WS_POPUP等),也试过社区里的相关解决方案,但都没能彻底消除这个边框。有没有大佬能给我一些解决思路?谢谢!
内容的提问来源于stack exchange,提问作者xamix
相关产品推荐
相关产品推荐

