picamera2でプレビューを調整する(Raspberry Pi、Python)

 前回はpicamera2でプレビュー画面を出すまでの簡単なPythonコードを作って実行してみました。

今回はプレビューウィンドウを調整してみます。コードは前回作成したものを流用していますのでご了承下さい。

プレビューウィンドウのパラメータ

ウィンドウの幅と高さ指定

 picamera2のプレビューウインドウの幅や高さを変えるには、Picamera2オブジェクトのstart_previewメソッドの引数を用います:

pc2.start_preview( Preview.QTGL, width = 200, height = 300 )

width及びheightを直接指定して幅高さを設定します。ここで注意ですが、ここで指定した幅高さはあくまでもプレビューウィンドウの大きさを変えるだけで、カメラが撮影する解像度には影響しません。また縦横比がカメラのサポート外の比率だった場合はレターボックスになり左右もしくは上下に黒帯が入ります:

width = 200, height = 300

ウィンドウの位置を指定

 デフォルト(指定なし)ではプレビューウィンドウが出る位置は適当ですが、指定すると固定位置に出てくれるようになります:

pc2.start_preview( Preview.QTGL, x = 10, y = 20 )

xでデスクトップの左端からの位置、yでデスクトップの上からの位置を指定します:

試してみると、x=0, y=0と与えると設定が無視されるようです。またyに小さい値を与えるとプレビューウィンドウのキャプションバーが見切れてしまいました。この辺り少し注意ですね。

表示される画像を上下左右に反転

画像を上下反転もしくは左右反転する機能があります:

from libcamera import Transform
pc2.start_preview( Preview.QTGL, transform=Transform( hflip=1, vflip = 1 ) )

引数のtransformにlibcameraライブラリに定義されているTransformオブジェクトを渡します。Transformオブジェクトは生成時にhflip(左右反転)とvflip(上下反転)のフラグを指定できます。1で有効、0で無効です。

くどいようですが、これはプレビュー時の変換機能なので、カメラが撮影した元の画像には影響しません。

プレビューウィンドウの作成タイプの指定

 ここまでしれーっと無視してきたstart_previewメソッドの最初の引数に与えていたこれ:

pc2.start_preview( Preview.QTGL )

このPreview.QTGLとは何なのでしょうか?これはプレビューウィンドウの作成タイプを指定しています。ちょっとややこしい話かもしれませんが、下記をご覧ください。

Preview.QTGL

 プレビューウィンドウをQt GUI Toolkitで作成し、OpenGL ESによるハードウェアアクセラレートを有効にして描画します。

 Qt GUI Toolkitというのはプラットフォームに依存しないGUIを作るためのライブラリです。例えばラズパイならラズパイの、WindowsならWindowsのウィンドウを同じコーディングで作成する事が出来ます。要は「標準のウィンドウを作ります~」っという事ですね。続くOpenGL ESというのは3D描画を高速で行うライブラリで、GPUを用いた高速描画を可能にします。

 この設定を使うとハードが持っているパワーを十分に発揮しプレビューできます。「んじゃこれ一択じゃん」と思うかもしれません。しかし、そうもいかない状況もあるんです。

Preview.DRM

 X Windowsが起動していない時にLinuxカーネルのDRM(Direct Rendering Manager)による描画を用いて直接プレビューを表示します。

 X WindowsというのはLinux(Unix)系のOSでグラフィカルなGUI操作を行えるフレームワークです。ラズパイがWindowsのようにアイコンがあったりマウスで色々操作できるのも、ラズパイがX Windowsを起動しているからなんです。で、ラズパイは実はX Windowsを起動せずに立ち上げる事が出来ます。その場合GUIではなくCUI(Command User Interface)で起動します。ターミナルオンリーな黒い画面と文字だけのラズパイです。この場合先のPreview.QTGLは使えません。と言うのもQTGLはX Windowsをベースに描画するからです。

 そこでこのCUIベースなラズパイの時にPreview.DRMをフラグに設定すると、CUIを描画している描画システムを用いてプレビューを表示します。

 CUIベースのラズパイってと思うかもしれませんが、ラズパイは組み込み系(ロボット制御とか家電とか色々)にも多様されていて、そこではGUIは必要無いんですね。そういう所でカメラのプレビューを表示したい場合、自然とこのフラグを選択する事になるわけです。

Prevew.QT

 Preview.QTGLと少しにた感じですが、GLが抜けてます。これはプレビューウィンドウはQt GUI Toolkitを用いて作成しますが、画像描画にOpenGL ESを使用しません。つまりハードウェアアクセラレートがOffになるという事です。ソフトウェアで描画するため処理負荷はかなり高くなってしまいます。

 「QTGLがあるんだし、これを使う意味ってないじゃん」って思うかもしれませんが、実は環境によってはQTGLをそもそもに使えない事があります。例えばVNC(Virtual Network Computing)でリモートアクセスしている場合に、QTGLのプレビューが全くできなかったりおかしくなったります。そういう場合にはこちらのフラグを選択する事になります。

 ただRaspberry Pi 4Bで試した感じではQTGLなプレビューをVNCを通して見る事が出来ているので、この環境ならQTGLでも良いのかなと思います。

Preview.NULL

 プレビューウィンドウを表示しません。「表示しないのに設定するってどういう意味?」っと思うかもしれません(こればっかりですね(^-^;)。実は、プレビューウィンドウを表示する事はカメラを扱う上で必須では無いんです。例えばカメラで撮影した映像をそのまま動画ファイルにする場合(車載カメラなど)、プレビューする必要は無い訳です。プログラム的にstart_previewメソッドは呼ぶ仕様なんだけど、プレビューは表示したくない…。そういう時にこのフラグを使います。

 Preview.NULLを指定した場合にもwidthとかtransformなどのパラメータは指定可能です。ただしすべて無視されます。

もちっと簡単な起動フラグ選択

 上のPreview何とか…ちょっとムズイんですよ。ちょっとハードやOSに対する精通が必要です。なので、実はstart_previewメソッドの最初の引数にはもう少し簡単な設定フラグも用意されています:

pc2.start_preview( True )

フラグとしてはTrue、False、Noneの3つがあります。

True

先のPreview.QTGL、Preview.DRM、Preview.QTのうち適切な物をPicamera2が自動的に選択してくれます。「これでいいじゃん!!」って思うわけですが…僕もそう思いますww

False

Preview.NULLと同じで、プレビューウィンドウを表示せずに起動します。

None

プレビュー機能そのものを切ってしまいます。カメラを直接利用するためにリソースを使う事ができます。

picamera2を使うコードを色々な環境に適用させる場合はTrueを使うのが安全そうです。一方でシステムが決まっている環境であればPreview系の指定をした方が確実です(自動選択が最適かはわからないため)

タイトルバーオプション

 オプション的な機能として、Preview.QTGLとPreview.QTでプレビューウィンドウを表示する際にタイトルバーに特定の情報を表示する事ができます。

 例えばラズパイが起動してからのデバイス接続経過時間(SensorTimestamp)と露光測定時間(ExposureTime)を表示するには、

pc2.title_fields = { "SensorTimestamp", "ExposureTime" }

Picamea2.title_fields変数にそろぞれを意味する文字列を配列で指定します。指定できる項目は結構沢山あります。詳しくはpicamera2のリファレンスにある「Appendix C: Camera controls」をご参照下さい。

終わりに

 今回はpicamera2のプレビューウィンドウの設定パラメータについて解説してきました。設定項目自体は少なめなので、項目の内容を理解すれば正しく設定できるかなと思います。

 プレビュー画面が見られるようになると、今度はカメラ自体を調整したくなります。色々ありますが、そうですねぇ…この記事の最初で取り付けた僕が買ったカメラ「64MP Hawk-eye」はオートフォーカス機能があるので、次はその辺りを調査してみようかなと思います。

ではまた(^-^)/

この記事が気に入ったらサポートをしてみませんか?