class RGBDisplay -- RGB 顯示器驅動程式¶
RGBDisplay 類別透過 STM32 LTDC(LCD-TFT)控制器驅動 24 位元並列 RGB LCD。LTDC 會以選定的像素時脈直接從 SDRAM 支援的影格緩衝區串流輸出像素,因此可在不需 CPU 介入的情況下達到高更新率(最高可達 120 Hz)。
在 OpenMV Cam Pure Thermal 上,相同的 24 位元並列匯流排同時也饋送至板載的 TFP410 HDMI 編碼器,因此其 HDMI 輸出也是透過此類別驅動的 -- 使用 display_on=False 可在仍然將像素時脈送往編碼器的同時,使板載 LCD 變黑。
面板解析度是透過 framesize 並使用 display 模組中定義的常數(QVGA、VGA、WVGA、HD、FHD……)來選擇的。面板專屬的初始化序列則透過 controller 關鍵字引數插入(例如針對 ST7701 面板的 ST7701)。背光亮度預設以單純的 GPIO 驅動,若將 DACBacklight / PWMBacklight 作為 backlight 傳入則改由其驅動。
影格是透過以 image.Image 呼叫 write() 來呈現的。此驅動程式會在內部處理 RGB 轉換、縮放、ROI、調色盤與方向變換。
範例 -- 以 60 Hz 將相機畫面鏡像到 480x272 面板上:
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 LCD 像素時脈。display_on啟用本機 LCD 輸出。在 OpenMV Cam Pure Thermal 上請傳入False,其 24 位元並列匯流排同時驅動板載 LCD 與 TFP410 HDMI 編碼器 -- 這會使板載 LCD 保持變黑,同時仍持續饋送 HDMI 編碼器。在其他 OpenMV Cam 上並沒有共用的輸出接收端,因此可保留其預設值。triple_buffer若為True,會使螢幕更新成為非阻塞式,代價是 RAM 中佔用三倍的顯示器大小。portrait交換 framesize 的寬與高。controller傳入控制器晶片類別的實例,以便與顯示器一同初始化它。backlight傳入要使用的背光控制器模組實例。預設情況下,背光會透過 GPIO 接腳控制。- clear(display_off: bool = False) None¶
將 LCD 螢幕清除為黑色。
display_off若為True,會關閉顯示邏輯,而非將影格緩衝區清除為黑色。在此之後您也應關閉背光以確保螢幕變黑,因為許多顯示器在僅有背光開啟時會呈現白色。
- backlight(value: int | None = None) int¶
設定 LCD 背光調光值,範圍從 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是要從 RGB565 影像中擷取並以灰階呈現的 RGB 通道(0=R、1=G、2=B)。-1會停用通道擷取。alpha控制影像的不透明程度,範圍從 0(完全透明 / 黑色)到 255(不透明)。color_palette為一張共 256 像素的 RGB565 影像,用作輸入影像灰階值的色彩查詢表。在rgb_channel擷取之後套用。也可以是調色盤列舉值(例如image.PALETTE_RAINBOW)。alpha_palette為一張共 256 像素的 GRAYSCALE 影像,用作輸入影像灰階值的逐像素 alpha 查詢表。在rgb_channel擷取之後套用。hint為下列旗標的邏輯 OR: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)。