třída RGBDisplay – ovladač RGB displeje¶
Třída RGBDisplay řídí 24bitové paralelní RGB LCD displeje prostřednictvím řadiče STM32 LTDC (LCD-TFT). LTDC streamuje pixely přímo z framebufferu uloženého v SDRAM zvolenou pixelovou frekvencí, takže jsou možné vysoké obnovovací frekvence (až 120 Hz) bez zapojení CPU.
Na OpenMV Cam Pure Thermal tatáž 24bitová paralelní sběrnice napájí také vestavěný HDMI enkodér TFP410, takže jeho HDMI výstup je řízen rovněž touto třídou – pomocí display_on=False zhasnete vestavěný LCD a přitom budete stále posílat pixely do enkodéru.
Rozlišení panelu se volí pomocí framesize s využitím konstant definovaných v modulu display (QVGA, VGA, WVGA, HD, FHD, …). Inicializační sekvence specifické pro daný panel se připojují přes klíčový argument controller (například ST7701 pro panely založené na ST7701). Jas podsvícení je ve výchozím nastavení řízen jako jednoduchý GPIO, nebo pomocí DACBacklight / PWMBacklight, pokud je některý z nich předán jako backlight.
Snímky se zobrazují voláním write() s objektem image.Image. Ovladač interně provádí převod na RGB, škálování, ROI, paletu a transformace orientace.
Příklad – zrcadlení kamery na panel 480x272 při 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)
Konstruktory¶
- 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)¶
framesizeJedno ze standardně podporovaných rozlišení (viz konstanty moduludisplay).refreshNastavuje obnovovací frekvenci obrazovky v hertzech (30-120). Tím se řídí pixelová frekvence RGB LCD.display_onPovoluje lokální LCD výstup. Na OpenMV Cam Pure Thermal předejteFalse, neboť její 24bitová paralelní sběrnice řídí jak vestavěný LCD, tak HDMI enkodér TFP410 – tím zůstane vestavěný LCD zhasnutý a přitom se stále napájí HDMI enkodér. Na ostatních OpenMV Cam neexistuje sdílený výstup a toto lze ponechat na výchozí hodnotě.triple_bufferPokud jeTrue, učiní aktualizace obrazovky neblokujícími za cenu trojnásobku velikosti displeje v RAM.portraitProhodí šířku a výšku framesize.controllerPředejte instanci třídy řadicího čipu, která se inicializuje spolu s displejem.backlightPředejte instanci modulu řadiče podsvícení, který se má použít. Ve výchozím nastavení je podsvícení řízeno pomocí GPIO pinu.- deinit() None¶
Uvolní I/O piny a RAM používané touto třídou. Volá se automaticky při zničení objektu.
- clear(display_off: bool = False) None¶
Vymaže obrazovku LCD do černa.
display_offpokud jeTrue, vypne logiku displeje namísto vymazání framebufferu do černa. Poté byste měli také vypnout podsvícení, abyste zajistili, že obrazovka zčerná, protože mnoho displejů je při zapnutém pouze podsvícení bílých.
- backlight(value: int | None = None) int¶
Nastavuje hodnotu stmívání podsvícení LCD, od 0 (vypnuto) do 100 (zapnuto). Bez argumentů vrátí aktuální hodnotu podsvícení.
Pokud nebyl konstruktoru předán řadič
DACBacklightneboPWMBacklight, je podsvícení řízeno jako GPIO pin a může nabývat pouze hodnoty 0 (vypnuto) nebo nenulové (zapnuto).
- 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¶
Zobrazí
image, jehož levý horní roh začíná na pozicix,y. Místo objektu obrazu lze také předat řetězec s cestou, čímž se obraz automaticky načte z disku.x_scaleurčuje, jak moc je zobrazený obraz škálován ve směru osy x. Pokud je tato hodnota záporná, obraz bude horizontálně překlopen. Pokud neníy_scalezadáno, bude odpovídatx_scalepro zachování poměru stran.y_scaleurčuje, jak moc je zobrazený obraz škálován ve směru osy y. Pokud je tato hodnota záporná, obraz bude vertikálně překlopen (vyžaduje trojité bufferování). Pokud neníx_scalezadáno, bude odpovídaty_scalepro zachování poměru stran.roije n-tice obdélníku oblasti zájmu(x, y, w, h)obrazu, který se má zobrazit.rgb_channelje RGB kanál (0=R, 1=G, 2=B), který se má extrahovat z obrazu RGB565 a vykreslit ve stupních šedi. Hodnota-1extrakci kanálu vypne.alphaurčuje, jak neprůhledný obraz je, od 0 (zcela průhledný / černý) do 255 (neprůhledný).color_paletteobraz RGB565 o celkem 256 pixelech používaný jako vyhledávací tabulka barev nad hodnotou stupně šedi vstupního obrazu. Aplikuje se po extrakcirgb_channel. Může to být také enum palety (např.image.PALETTE_RAINBOW).alpha_paletteobraz ve stupních šedi o celkem 256 pixelech používaný jako vyhledávací tabulka alfy pro jednotlivé pixely nad hodnotou stupně šedi vstupního obrazu. Aplikuje se po extrakcirgb_channel.hintje logický součet (OR) příznaků:image.AREA: Při zmenšování použít plošné škálování namísto nejbližšího souseda.image.BILINEAR: Použít bilineární škálování namísto nejbližšího souseda.image.BICUBIC: Použít bikubické škálování namísto nejbližšího souseda.image.CENTER: Vycentrovat obraz na displeji (aplikuje se po škálování).image.HMIRROR: Horizontálně zrcadlit obraz.image.VFLIP: Vertikálně překlopit obraz.image.TRANSPOSE: Transponovat obraz (prohodit x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Provést extrakcirgb_channelpřed škálováním.image.APPLY_COLOR_PALETTE_FIRST: Aplikovatcolor_palettepřed škálováním.image.SCALE_ASPECT_KEEP: Škálovat obraz tak, aby se vešel dovnitř displeje.image.SCALE_ASPECT_EXPAND: Škálovat obraz tak, aby vyplnil displej (s oříznutím).image.SCALE_ASPECT_IGNORE: Škálovat obraz tak, aby vyplnil displej (s roztažením).image.ROTATE_90: Otočit o 90 stupňů (VFLIP | TRANSPOSE).image.ROTATE_180: Otočit o 180 stupňů (HMIRROR | VFLIP).image.ROTATE_270: Otočit o 270 stupňů (HMIRROR | TRANSPOSE).