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

Освобождает выводы ввода-вывода и ОЗУ, используемые классом. Вызывается автоматически при уничтожении.

width() int

Возвращает ширину экрана.

height() int

Возвращает высоту экрана.

triple_buffer() bool

Возвращает, включена ли тройная буферизация.

bgr() bool

Возвращает, поменяны ли местами красный и синий каналы.

byte_swap() bool

Возвращает, поменяны ли местами байты пикселей RGB565 на выходе.

framesize() int

Возвращает константу framesize, с которой был настроен дисплей.

refresh() int

Возвращает частоту обновления.

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).