classe RGBDisplay – Controlador de Ecrã RGB

A classe RGBDisplay controla LCDs RGB paralelos de 24 bits através do controlador STM32 LTDC (LCD-TFT). O LTDC transmite pixels diretamente de um framebuffer suportado por SDRAM ao clock de pixel escolhido, pelo que são possíveis taxas de atualização elevadas (até 120 Hz) sem envolvimento do CPU.

Na OpenMV Cam Pure Thermal, o mesmo barramento paralelo de 24 bits também alimenta um codificador HDMI TFP410 integrado, pelo que a sua saída HDMI é igualmente controlada por esta classe – utilize display_on=False para desativar o LCD integrado enquanto continua a enviar pixels para o codificador.

A resolução do painel é selecionada através de framesize utilizando as constantes definidas no módulo display (QVGA, VGA, WVGA, HD, FHD, …). As sequências de inicialização específicas do painel são fornecidas através do argumento de palavra-chave controller (por exemplo, ST7701 para painéis baseados em ST7701). O brilho da retroiluminação é controlado como um GPIO simples por defeito, ou por DACBacklight / PWMBacklight se um for passado como backlight.

Os fotogramas são apresentados chamando write() com um image.Image. O controlador trata internamente da conversão RGB, escalonamento, ROI, paleta e transformações de orientação.

Exemplo – espelhar a câmara num painel 480x272 a 60 Hz:

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)

Construtores

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 Uma das resoluções padrão suportadas (consulte as constantes do módulo display).

refresh Define a taxa de atualização do ecrã em hertz (30-120). Controla o clock de pixel do LCD RGB.

display_on Ativa a saída LCD local. Passe False na OpenMV Cam Pure Thermal, cujo barramento paralelo de 24 bits controla tanto o LCD integrado como o codificador HDMI TFP410 – isto mantém o LCD integrado desativado enquanto continua a alimentar o codificador HDMI. Noutras OpenMV Cams não existe um sink partilhado e pode ser deixado no seu valor predefinido.

triple_buffer Se True, torna as atualizações do ecrã não bloqueantes ao custo de 3x o tamanho do ecrã em RAM.

portrait Troca a largura e a altura do framesize.

controller Passe uma instância de classe do chip controlador para o inicializar juntamente com o ecrã.

backlight Passe uma instância do módulo controlador de retroiluminação a utilizar. Por defeito, a retroiluminação será controlada por um pino GPIO.

deinit() None

Liberta os pinos de I/O e a RAM utilizados pela classe. É chamado automaticamente na destruição.

width() int

Devolve a largura do ecrã.

height() int

Devolve a altura do ecrã.

triple_buffer() bool

Devolve se o triple buffering está ativado.

bgr() bool

Devolve se os canais vermelho e azul estão trocados.

byte_swap() bool

Devolve se os bytes de pixel RGB565 estão trocados na saída.

framesize() int

Devolve a constante framesize com que o ecrã foi configurado.

refresh() int

Devolve a taxa de atualização.

clear(display_off: bool = False) None

Limpa o ecrã LCD para preto.

display_off se True, desliga a lógica do ecrã em vez de limpar o framebuffer para preto. Deverá também desligar a retroiluminação após isto para garantir que o ecrã fica preto, pois muitos ecrãs ficam brancos quando apenas a retroiluminação está ligada.

backlight(value: int | None = None) int

Define o valor de escurecimento da retroiluminação do LCD, de 0 (desligado) a 100 (ligado). Passe sem argumentos para obter o valor atual da retroiluminação.

A menos que um controlador DACBacklight ou PWMBacklight tenha sido passado ao construtor, a retroiluminação é controlada como um pino GPIO e apenas alternará entre 0 (desligado) e não-zero (ligado).

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

Apresenta uma image cujo canto superior esquerdo começa na localização x, y. Pode também ser passada uma string de caminho em vez de um objeto de imagem para carregar automaticamente a imagem do disco.

x_scale controla o fator pelo qual a imagem apresentada é escalada na direção x. Se este valor for negativo, a imagem será espelhada horizontalmente. Se y_scale não for especificado, corresponderá a x_scale para manter a proporção.

y_scale controla o fator pelo qual a imagem apresentada é escalada na direção y. Se este valor for negativo, a imagem será invertida verticalmente (requer triple buffering). Se x_scale não for especificado, corresponderá a y_scale para manter a proporção.

roi é o tuplo de retângulo da região de interesse (x, y, w, h) da imagem a apresentar.

rgb_channel é o canal RGB (0=R, 1=G, 2=B) a extrair de uma imagem RGB565 e renderizar em escala de cinzentos. -1 desativa a extração de canal.

alpha controla a opacidade da imagem, de 0 (totalmente transparente / preto) a 255 (opaco).

color_palette uma imagem RGB565 de 256 pixels no total utilizada como tabela de consulta de cor sobre o valor em escala de cinzentos da imagem de entrada. Aplicada após a extração de rgb_channel. Pode também ser um enum de paleta (ex.: image.PALETTE_RAINBOW).

alpha_palette uma imagem GRAYSCALE de 256 pixels no total utilizada como tabela de consulta de alfa por pixel sobre o valor em escala de cinzentos da imagem de entrada. Aplicada após a extração de rgb_channel.

hint é um OR lógico dos sinalizadores: