class RGBDisplay – RGB-Display-Treiber¶
Die Klasse RGBDisplay steuert parallele 24-Bit-RGB-LCDs über den STM32-LTDC-Controller (LCD-TFT). Der LTDC streamt Pixel direkt aus einem SDRAM-gestützten Framebuffer mit dem gewählten Pixeltakt, sodass hohe Bildwiederholraten (bis zu 120 Hz) ohne Beteiligung der CPU möglich sind.
Auf der OpenMV Cam Pure Thermal speist derselbe parallele 24-Bit-Bus zudem einen integrierten TFP410-HDMI-Encoder, sodass auch deren HDMI-Ausgang über diese Klasse angesteuert wird – verwende display_on=False, um das integrierte LCD dunkelzuschalten, während weiterhin Pixel zum Encoder getaktet werden.
Die Panel-Auflösung wird über framesize mit den im Modul display definierten Konstanten ausgewählt (QVGA, VGA, WVGA, HD, FHD, …). Panel-spezifische Initialisierungssequenzen werden über das Schlüsselwortargument controller eingebunden (zum Beispiel ST7701 für ST7701-basierte Panels). Die Hintergrundbeleuchtungshelligkeit wird standardmäßig als einfacher GPIO angesteuert oder durch DACBacklight / PWMBacklight, falls eine davon als backlight übergeben wird.
Einzelbilder werden durch Aufruf von write() mit einem image.Image dargestellt. Der Treiber übernimmt die RGB-Konvertierung, Skalierung, ROI-, Paletten- und Orientierungstransformationen intern.
Beispiel – die Kamera auf ein 480x272-Panel mit 60 Hz spiegeln:
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)
Konstruktoren¶
- 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)¶
framesizeEine der standardmäßig unterstützten Auflösungen (siehe die Konstanten des Modulsdisplay).refreshLegt die Bildwiederholrate des Bildschirms in Hertz fest (30-120). Dies steuert den Pixeltakt des RGB-LCDs.display_onAktiviert den lokalen LCD-Ausgang. ÜbergibFalseauf der OpenMV Cam Pure Thermal, deren paralleler 24-Bit-Bus sowohl das integrierte LCD als auch den TFP410-HDMI-Encoder ansteuert – so bleibt das integrierte LCD dunkelgeschaltet, während der HDMI-Encoder weiterhin gespeist wird. Auf anderen OpenMV Cams gibt es keine gemeinsame Senke, und dies kann auf seinem Standardwert belassen werden.triple_bufferBeiTruewerden Aktualisierungen des Bildschirms nicht blockierend, allerdings auf Kosten des dreifachen Display-Speichers im RAM.portraitVertauscht Breite und Höhe der framesize.controllerÜbergib eine Instanz einer Controller-Chip-Klasse, um diesen zusammen mit dem Display zu initialisieren.backlightÜbergib eine Instanz eines Hintergrundbeleuchtungs-Controllermoduls, das verwendet werden soll. Standardmäßig wird die Hintergrundbeleuchtung über einen GPIO-Pin gesteuert.- deinit() None¶
Gibt die von der Klasse verwendeten I/O-Pins und den RAM frei. Dies wird bei der Zerstörung automatisch aufgerufen.
- clear(display_off: bool = False) None¶
Setzt den LCD-Bildschirm auf Schwarz.
display_offBeiTruewird die Display-Logik abgeschaltet, anstatt den Framebuffer auf Schwarz zu setzen. Du solltest danach auch die Hintergrundbeleuchtung ausschalten, damit der Bildschirm wirklich schwarz wird, da viele Displays weiß sind, wenn nur die Hintergrundbeleuchtung eingeschaltet ist.
- backlight(value: int | None = None) int¶
Setzt den Dimmwert der LCD-Hintergrundbeleuchtung, von 0 (aus) bis 100 (an). Übergib keine Argumente, um den aktuellen Wert der Hintergrundbeleuchtung abzurufen.
Sofern dem Konstruktor kein
DACBacklight- oderPWMBacklight-Controller übergeben wurde, wird die Hintergrundbeleuchtung als GPIO-Pin gesteuert und kann nur von 0 (aus) auf ungleich null (an) wechseln.
- 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¶
Zeigt ein
imagean, dessen linke obere Ecke an Positionx,ybeginnt. Anstelle eines Bildobjekts kann auch ein Pfad-String übergeben werden, um das Bild automatisch von der Festplatte zu laden.x_scalesteuert, wie stark das angezeigte Bild in x-Richtung skaliert wird. Ist dieser Wert negativ, wird das Bild horizontal gespiegelt. Wirdy_scalenicht angegeben, entspricht esx_scale, um das Seitenverhältnis beizubehalten.y_scalesteuert, wie stark das angezeigte Bild in y-Richtung skaliert wird. Ist dieser Wert negativ, wird das Bild vertikal gespiegelt (erfordert Triple Buffering). Wirdx_scalenicht angegeben, entspricht esy_scale, um das Seitenverhältnis beizubehalten.roiist das Rechteck-Tupel(x, y, w, h)des anzuzeigenden Interessensbereichs des Bildes.rgb_channelist der RGB-Kanal (0=R, 1=G, 2=B), der aus einem RGB565-Bild extrahiert und in Graustufen dargestellt werden soll.-1deaktiviert die Kanalextraktion.alphasteuert, wie undurchsichtig das Bild ist, von 0 (vollständig transparent / schwarz) bis 255 (undurchsichtig).color_paletteein RGB565-Bild mit insgesamt 256 Pixeln, das als Farbnachschlagetabelle auf den Graustufenwert des Eingabebildes angewendet wird. Wird nach derrgb_channel-Extraktion angewendet. Kann auch ein Paletten-Enum sein (z. B.image.PALETTE_RAINBOW).alpha_paletteein GRAYSCALE-Bild mit insgesamt 256 Pixeln, das als Alpha-Nachschlagetabelle pro Pixel auf den Graustufenwert des Eingabebildes angewendet wird. Wird nach derrgb_channel-Extraktion angewendet.hintist eine logische ODER-Verknüpfung der Flags:image.AREA: Beim Herunterskalieren Flächenskalierung statt Nächster-Nachbar verwenden.image.BILINEAR: Bilineare Skalierung statt Nächster-Nachbar verwenden.image.BICUBIC: Bikubische Skalierung statt Nächster-Nachbar verwenden.image.CENTER: Das Bild auf dem Display zentrieren (nach der Skalierung angewendet).image.HMIRROR: Das Bild horizontal spiegeln.image.VFLIP: Das Bild vertikal spiegeln.image.TRANSPOSE: Das Bild transponieren (x/y vertauschen).image.EXTRACT_RGB_CHANNEL_FIRST: Diergb_channel-Extraktion vor der Skalierung durchführen.image.APPLY_COLOR_PALETTE_FIRST:color_palettevor der Skalierung anwenden.image.SCALE_ASPECT_KEEP: Das Bild so skalieren, dass es in das Display passt.image.SCALE_ASPECT_EXPAND: Das Bild so skalieren, dass es das Display ausfüllt (mit Zuschneiden).image.SCALE_ASPECT_IGNORE: Das Bild so skalieren, dass es das Display ausfüllt (mit Strecken).image.ROTATE_90: Um 90 Grad drehen (VFLIP | TRANSPOSE).image.ROTATE_180: Um 180 Grad drehen (HMIRROR | VFLIP).image.ROTATE_270: Um 270 Grad drehen (HMIRROR | TRANSPOSE).