Слишком большое окно imshow OpenCV - размытое изображение - PullRequest
0 голосов
/ 11 января 2019

В OpenCV-Python, когда я создаю namedWindow с использованием cv2.resizeWindow с размерами изображения, которое я хочу отобразить, окно не изменяется должным образом.

import numpy as np
import cv2

window_title = 'image'

img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
height, width = img.shape[:-1]

cv2.namedWindow(window_title, cv2.WINDOW_NORMAL)
cv2.resizeWindow(window_title, width, height)
cv2.imshow(window_title, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

См. Прикрепленный скриншот, чтобы увидеть результаты.

test.jpg является частью скриншота окна VS Code, 800x600 пикселей. После изменения размера окно изображения явно слишком большое.

Как можно легко изменить размер окна до правильного размера, чтобы отображаемое изображение не было размытым?

Я использую Python 3.7.2, OpenCV 3.4.2, Windows 10 64-bit.

1 Ответ

0 голосов
/ 11 января 2019

ДанМашек правильно заметил 125% масштабирование окна OpenCV по сравнению с исходным размером изображения, что привело меня к решению.

Такое поведение является результатом функции масштабирования пользовательского интерфейса в более поздних версиях Windows. (Загляните в «Настройки \ Система \ Дисплей \ Масштабирование»)

Поскольку OpenCV не помечает свои окна графического интерфейса как «DPI Aware», Windows масштабирует их до любого процента, указанного пользователем.

(Другой побочный эффект заключается в том, что win32gui.GetWindowRect () возвращает, казалось бы, неверные координаты, как описано здесь )


Обход

Перейдите по пути python.exe, щелкните правой кнопкой мыши исполняемый файл, выберите «Свойства» и на вкладке «Совместимость» нажмите «Изменить настройки высокого DPI». Затем активируйте «Переопределить поведение масштабирования с высоким разрешением», установите «Выполнение масштабирования» в «Приложение».

Это изменит поведение для всех сеансов, которые обслуживает python.exe. Для преодоления этого ограничения можно использовать виртуальные среды.


Решение

Эта статья SO описывает, как можно установить поведение масштабирования на уровне сеанса в коде Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...