OpenCv граница верхней и левой рамки OpenGL c ++ - PullRequest
0 голосов
/ 26 мая 2018

Я использую самоскомпилированный OpenCv 3.3 с включенными OPENGL и CUDA в Windows 7.

У меня проблемы с отображением изображения в полноэкранном режиме без каких-либо границ.Я использую следующий минимальный пример для своего теста:

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

Этот код показывает мне рисование полноэкранных окон синим цветом, однако он остается ОДНОЙ границей пикселя на верхней и левой границах: Серая левая иверхняя граница

Кажется, что граница не является границей, как объяснено здесь: https://stackoverflow.com/a/38494752/1570628

Фактически это фон главного окна, созданного OpenCv.Копаясь в код OpenCv, он эффективно создает 2 окна внутри 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" );

Таким образом, «граница», которую мы видели, это mainhWnd (основной класс HighGUI) цвет.Тем не менее, это означает, что мое отображаемое изображение в синем смещено на один пиксель влево и вправо от экрана, поэтому я теряю 1 строку пикселя снизу и справа, потому что они выходят за пределы экрана.

Я могувижу, что это так, потому что на двойном экране я вижу правую линию переполнения пикселей на моем втором экране.Более того, если я рисую горизонтальную линию до последней строки моего изображения, она не появляется, то же самое происходит на вертикальной линии для последнего столбца моего изображения.

Для решения тестирования я попытался изменить стиль mainhWnd и hWnd непосредственно в коде OpenCv с использованием множества комбинаций флагов, также тестирование с использованием WS_POPUP, но в любом случае у меня всегда есть верхняя и левая границы.

Iтакже попытался решить здесь, но это не удаляет границу: https://stackoverflow.com/a/6512315/1570628

У кого-нибудь есть подсказка для моей проблемы?Привет.

1 Ответ

0 голосов
/ 12 июля 2018

Эй, это сработало для меня (по крайней мере, на python, и, поскольку вам просто нужно поменять флаг, я верю, что это сработает и для вас)

Изменить этот флаг "CV_WINDOW_OPENGL | cv ::WINDOW_NORMAL) "к этому флагу" WINDOW_FREERATIO "

И вуаля!Проблема решена

...