класс TVDisplay – Драйвер TV Shield

Класс TVDisplay управляет OpenMV TV Shield, который преобразует RGB565-буфер кадра в композитный видеосигнал NTSC (352x240, 60 полей/с с чересстрочной развёрткой), подходящий для любого телевизора или аналогового видеомонитора.

Поддерживаются два варианта шилда:

  • Проводной TV Shield, который выводит композитный сигнал на единственный разъём RCA.

  • Wireless TV Shield, который подаёт тот же сигнал на аналоговый видеопередатчик 2,4 ГГц. Канал приёмника (1–8) выбирается во время выполнения через ioctl() с display.IOCTL_CHANNEL; до выполнения этого вызова ни один канал не выбран.

Разрешение и кадрирование фиксированы – TVDisplay не принимает аргумент framesize. Кадры выводятся путём передачи image.Image в write(), который внутренне обрабатывает масштабирование, ROI, палитру и преобразования ориентации.

Пример использования:

import csi
import display

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.SIF)              # 352x240, matches the TV output

tv = display.TVDisplay()

while True:
    tv.write(csi0.snapshot())

Конструкторы

class display.TVDisplay(triple_buffer: bool = True)

triple_buffer Если True, то делает обновления экрана неблокирующими ценой утроенного размера дисплея в RAM. Значение по умолчанию зависит от платы.

deinit() None

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

width() int

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

height() int

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

refresh() int

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

triple_buffer() bool

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

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 = 256, color_palette: int | 'image.Image' | None = None, alpha_palette: 'image.Image' | None = None, hint: int = 0) None

Отображает image, чей левый верхний угол начинается в позиции x, y.

x_scale управляет тем, насколько отображаемое изображение масштабируется в направлении x (число с плавающей точкой). Если это значение отрицательное, изображение будет отражено по горизонтали.

y_scale управляет тем, насколько отображаемое изображение масштабируется в направлении y (число с плавающей точкой). Если это значение отрицательное, изображение будет отражено по вертикали.

roi – это кортеж прямоугольника области интереса (x, y, w, h) изображения для отображения.

rgb_channel – это RGB-канал (0=R, G=1, B=2) для извлечения из RGB565-изображения и отрисовки на дисплее.

alpha управляет тем, насколько непрозрачно изображение. Значение 256 отображает непрозрачное изображение, а значение меньше 256 даёт чёрное прозрачное изображение. 0 приводит к идеально чёрному изображению.

color_palette если не -1, может быть перечислением цветовой палитры или RGB565-изображением размером в 256 пикселей, используемым как таблица соответствия цветов для значения входного изображения в оттенках серого.

alpha_palette если не -1, может быть GRAYSCALE-изображением размером в 256 пикселей, используемым как альфа-палитра, которая модулирует значение alpha входного изображения на уровне отдельных пикселей.

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

clear(display_off: bool = False) None

Очищает экран до чёрного цвета.

display_off принимается для совместимости API с другими классами дисплеев и игнорируется.

ioctl(cmd: int, *args) object

Общая точка входа ioctl.

Передайте display.IOCTL_CHANNEL в качестве cmd для установки или получения канала вещания беспроводного TV-шилда. Со вторым аргументом (1-8) канал устанавливается; без второго аргумента возвращается текущий канал. Ни один канал не выбран, пока не сделан первый вызов установки.