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をブランク状態にできます。

パネル解像度は、display モジュールで定義された定数(QVGAVGAWVGAHDFHD など)を使って framesize で選択します。パネル固有の初期化シーケンスは controller キーワード引数を介して組み込まれます(例:ST7701ベースのパネル向けの ST7701)。バックライトの明るさはデフォルトでは単純なGPIOとして駆動されますが、backlight として DACBacklight / PWMBacklight を渡すこともできます。

フレームは image.Image を指定して write() を呼び出すことで表示されます。ドライバはRGB変換、スケーリング、ROI、パレット、向きの変換を内部的に処理します。

例 -- カメラ映像を480x272パネルに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)

コンストラクタ

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 標準でサポートされている解像度の1つ(display モジュール定数を参照)。

refresh 画面のリフレッシュレートをヘルツ単位(30〜120)で設定します。これはRGB LCDのピクセルクロックを制御します。

display_on ローカルLCD出力を有効にします。OpenMV Cam Pure Thermalでは False を渡してください。このボードの24ビットパラレルバスはオンボードLCDとTFP410 HDMIエンコーダの両方を駆動するため、これによりHDMIエンコーダへの供給を続けながらオンボードLCDをブランク状態に保てます。他のOpenMV Camでは共有シンクがないため、デフォルトのままで構いません。

triple_buffer True の場合、ディスプレイサイズの3倍のRAMを消費する代わりに、画面更新がノンブロッキングになります。

portrait framesizeの幅と高さを入れ替えます。

controller コントローラチップクラスのインスタンスを渡すと、ディスプレイと一緒に初期化されます。

backlight 使用するバックライトコントローラモジュールのインスタンスを渡します。デフォルトでは、バックライトはGPIOピンを介して制御されます。

deinit() None

このクラスが使用するI/OピンとRAMを解放します。これはデストラクション時に自動的に呼び出されます。

width() int

画面の幅を返します。

height() int

画面の高さを返します。

triple_buffer() bool

トリプルバッファリングが有効かどうかを返します。

bgr() bool

赤と青のチャンネルが入れ替えられているかどうかを返します。

byte_swap() bool

出力時にRGB565ピクセルのバイトが入れ替えられるかどうかを返します。

framesize() int

ディスプレイが設定されたframesize定数を返します。

refresh() int

リフレッシュレートを返します。

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

左上隅が位置 xy から始まる image を表示します。画像オブジェクトの代わりにパス文字列を渡して、ディスクから画像を自動的に読み込ませることもできます。

x_scale は表示画像をx方向にどれだけスケーリングするかを制御します。この値が負の場合、画像は水平方向に反転されます。y_scale が指定されていない場合は、アスペクト比を維持するために x_scale と一致します。

y_scale は表示画像をy方向にどれだけスケーリングするかを制御します。この値が負の場合、画像は垂直方向に反転されます(トリプルバッファリングが必要)。x_scale が指定されていない場合は、アスペクト比を維持するために y_scale と一致します。

roi は表示する画像の関心領域(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画像です。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)。