class RGBDisplay – драйвер RGB-дисплея¶
Класс RGBDisplay управляет 24-битными параллельными RGB ЖК-дисплеями через контроллер STM32 LTDC (LCD-TFT). LTDC выводит пиксели напрямую из буфера кадра, размещённого в SDRAM, с заданной пиксельной частотой, поэтому возможны высокие частоты обновления (до 120 Гц) без участия процессора.
На OpenMV Cam Pure Thermal та же 24-битная параллельная шина также питает встроенный HDMI-кодер TFP410, поэтому его HDMI-выход управляется через этот же класс – используйте display_on=False, чтобы погасить встроенный ЖК-дисплей, продолжая при этом подавать пиксели на кодер.
Разрешение панели выбирается через framesize с помощью констант, определённых в модуле display (QVGA, VGA, WVGA, HD, FHD, …). Последовательности инициализации, специфичные для панели, подключаются через именованный аргумент controller (например, ST7701 для панелей на базе ST7701). Яркость подсветки по умолчанию управляется как простой GPIO либо через DACBacklight / PWMBacklight, если он передан как backlight.
Кадры выводятся вызовом write() с объектом image.Image. Драйвер внутренне выполняет преобразование RGB, масштабирование, ROI, применение палитры и преобразования ориентации.
Пример – зеркалирование изображения с камеры на панель 480x272 с частотой 60 Гц:
import csi
import display
import image
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
lcd = display.RGBDisplay(framesize=display.FHVGA, refresh=60)
while True:
lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)
Конструкторы¶
- class display.RGBDisplay(framesize: int = display.FWVGA, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, controller: object | None = None, backlight: object | None = None)¶
framesizeОдно из стандартных поддерживаемых разрешений (см. константы модуляdisplay).refreshЗадаёт частоту обновления экрана в герцах (30-120). Это управляет пиксельной частотой RGB ЖК-дисплея.display_onВключает локальный ЖК-выход. ПередайтеFalseна OpenMV Cam Pure Thermal, чья 24-битная параллельная шина управляет одновременно встроенным ЖК-дисплеем и HDMI-кодером TFP410 – это держит встроенный ЖК-дисплей погашенным, продолжая при этом питать HDMI-кодер. На других OpenMV Cam общего приёмника нет, и это можно оставить значением по умолчанию.triple_bufferЕслиTrue, делает обновления экрана неблокирующими ценой утроенного размера дисплея в ОЗУ.portraitМеняет местами ширину и высоту framesize.controllerПередайте экземпляр класса микросхемы-контроллера для его инициализации вместе с дисплеем.backlightПередайте экземпляр модуля контроллера подсветки для использования. По умолчанию подсветка управляется через вывод GPIO.- deinit() None¶
Освобождает выводы ввода-вывода и ОЗУ, используемые классом. Вызывается автоматически при уничтожении.
- clear(display_off: bool = False) None¶
Очищает экран ЖК-дисплея в чёрный цвет.
display_offеслиTrue, отключает логику дисплея вместо очистки буфера кадра в чёрный цвет. После этого вам также следует выключить подсветку, чтобы экран стал чёрным, так как многие дисплеи белые, когда включена только подсветка.
- backlight(value: int | None = None) int¶
Задаёт значение затемнения подсветки ЖК-дисплея, от 0 (выключено) до 100 (включено). Не передавайте аргументы, чтобы получить текущее значение подсветки.
Если в конструктор не был передан контроллер
DACBacklightилиPWMBacklight, подсветка управляется как вывод GPIO и может принимать только значения 0 (выключено) или ненулевое (включено).
- write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None¶
Отображает
image, левый верхний угол которого начинается в позицииx,y. Вместо объекта изображения можно также передать строку пути, чтобы автоматически загрузить изображение с диска.x_scaleуправляет тем, насколько отображаемое изображение масштабируется по оси x. Если это значение отрицательное, изображение будет отражено по горизонтали. Еслиy_scaleне указан, он будет соответствоватьx_scaleдля сохранения соотношения сторон.y_scaleуправляет тем, насколько отображаемое изображение масштабируется по оси y. Если это значение отрицательное, изображение будет отражено по вертикали (требует тройной буферизации). Еслиx_scaleне указан, он будет соответствоватьy_scaleдля сохранения соотношения сторон.roi– это кортеж прямоугольника области интереса(x, y, w, h)изображения для отображения.rgb_channel– это RGB-канал (0=R, 1=G, 2=B) для извлечения из изображения RGB565 и отображения в оттенках серого.-1отключает извлечение канала.alphaуправляет тем, насколько непрозрачно изображение, от 0 (полностью прозрачное / чёрное) до 255 (непрозрачное).color_paletteизображение RGB565 общим размером 256 пикселей, используемое как таблица соответствия цветов для значения оттенков серого входного изображения. Применяется после извлеченияrgb_channel. Может также быть перечислением палитры (например,image.PALETTE_RAINBOW).alpha_paletteизображение GRAYSCALE общим размером 256 пикселей, используемое как попиксельная таблица соответствия альфа-канала для значения оттенков серого входного изображения. Применяется после извлеченияrgb_channel.hint– это логическое ИЛИ флагов:image.AREA: Использовать масштабирование по площади при уменьшении вместо метода ближайшего соседа.image.BILINEAR: Использовать билинейное масштабирование вместо метода ближайшего соседа.image.BICUBIC: Использовать бикубическое масштабирование вместо метода ближайшего соседа.image.CENTER: Центрировать изображение на дисплее (применяется после масштабирования).image.HMIRROR: Зеркально отразить изображение по горизонтали.image.VFLIP: Отразить изображение по вертикали.image.TRANSPOSE: Транспонировать изображение (поменять местами x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Выполнить извлечениеrgb_channelдо масштабирования.image.APPLY_COLOR_PALETTE_FIRST: Применитьcolor_paletteдо масштабирования.image.SCALE_ASPECT_KEEP: Масштабировать изображение так, чтобы оно поместилось внутри дисплея.image.SCALE_ASPECT_EXPAND: Масштабировать изображение так, чтобы заполнить дисплей (с обрезкой).image.SCALE_ASPECT_IGNORE: Масштабировать изображение так, чтобы заполнить дисплей (с растяжением).image.ROTATE_90: Повернуть на 90 градусов (VFLIP | TRANSPOSE).image.ROTATE_180: Повернуть на 180 градусов (HMIRROR | VFLIP).image.ROTATE_270: Повернуть на 270 градусов (HMIRROR | TRANSPOSE).