0

I'm using a self compiled of OpenCv 3.3 with OPENGL and CUDA enabled on Windows 7.

I'm having trouble to display an image in fullscreen mode without any border. I use the following minimal example for my test:

// 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);
}

This code show me a full screen windows paint in blue, however it remain a ONE pixel border on top and left border: Grey left and top border

The border seem not to be the border as explained here: https://stackoverflow.com/a/38494752/1570628

In fact it's the background of the main window created by OpenCv. Digging into OpenCv code, it effectivelly create 2 windows inside cvNamedWindow function:

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" );

So the 'border' we saw is the mainhWnd (Main HighGUI class) color. However, it mean that my displayed image in blue is shifted by one pixel to the rigth and bottom of my screen, so I loose 1 line of pixel on bottom and right side because they overflow the screen.

I can see that it's the case because on a dual screen I can see the right line of pixel overflow on my second screen. More over, if I draw an horizontal line to the last line of my image, it doesn't appear, same occur on vertical line for last column of my image.

For testing solution, I tried to change style of mainhWnd and hWnd directly in OpenCv code by using many combination of flags, also testing using WS_POPUP, but anyway I always have this top and left border.

I also tried solution here but it do not remove the border: https://stackoverflow.com/a/6512315/1570628

Do anyone have a clue for my problem? Regards.

xamix
  • 13
  • 5
  • After some digging, I was unable to found the cause of problem. I came accross this Open issue on OpenCv project: https://github.com/opencv/opencv/issues/4605 So it seem a long time bug which is not fixed. For the moment I added freeGlut to my project in order to use it for the OpenGL display part: http://freeglut.sourceforge.net/ It works perfectly and I have no top and left border. Also I can continue to use OpenCv for manipulate GpuMat. – xamix Jun 01 '18 at 17:58

1 Answers1

0

Hey this worked for me (at least it did on python, and since you just have to change a flag, i believe this will work for you too)

Change this flag "CV_WINDOW_OPENGL | cv::WINDOW_NORMAL)" to this flag "WINDOW_FREERATIO"

And voila! Problem Solved

  • I tested it and it always show a grey border. Moreover I cannot use this because I use OPENGL so I'm stuck with CV_WINDOW_OPENGL. I need an Opengl Window for display 4K video stream from graphic cards. – xamix Jul 18 '18 at 16:19