自宅内の見守りカメラをアップデートした:③構成を変更しよう編:ラズパイカメラモジュールのマニュアル撮影を極める…!


はじめに

本記事はこちらのパート③にあたります。
もし内容に興味を持たれましたら、他のパートもご覧頂けると幸いです。(順次執筆中…)

システム構成の変更

ハードウェアは据え置きで、ソフトウェアのみ構成を変更します。

パフォーマンス改善:画像取得方法の変更

カメラモジュールを使って単純に静止画を取得したいだけなので、標準コマンドを自作プログラムの中から呼び出して使うようにします。

Before After
Opencv-python ラズパイ標準コマンドraspistill

取得画像の明るさ適正化:画像取得設定の固定化とキャリブレーションモードの導入

画像取得設定を固定化するには、raspistillのオプションで各種自動調整を切りつつ、必要なパラメータを全て指定する必要があります。
ここで言うところの自動調整とは、オートホワイトバランス(awb)と自動ゲインコントロール(agc)です。
それらをoffにすると、下記の項目を指定する必要があります。公式ドキュメントを見ても端的にまとまっていなかったため、どのオプションを与えれば良いかを明確にするまでが大変でした…。

オプション 内容
-ss シャッター開放時間
-br 画像の明るさ
-awbg ホワイトバランス
-ag アナログゲイン
-dg デジタルゲイン

これをいちいちトライアンドエラーするのは辛いです。
そこで同じくraspistillのオプションで実現できる、自動調整結果の標準出力-setオプションを使います。

-setオプションを使うと以下のようなカメラ設定値が標準出力されます。何行も出力されてきますが、基本的には一番最後の行が調整完了済み結果となります。
そこから次の対応付けをして各オプションに値を与えればOKです。

input
raspistill -set
output
Camera control callback  cmd=0x48435045mmal: Exposure now 499982, analog gain 1075/256, digital gain 256/256
mmal: AWB R=314/256, B=708/256
Camera control callback  cmd=0x48435045mmal: Exposure now 499982, analog gain 1075/256, digital gain 258/256
mmal: AWB R=317/256, B=698/256
Camera control callback  cmd=0x48435045mmal: Exposure now 499982, analog gain 1130/256, digital gain 256/256
mmal: AWB R=309/256, B=729/256

オプション 標準出力結果との対応
-ss Exposure now の値をそのまま与える
-awbg AWB R, Bをそれぞれ小数に直して与える。例: -awbg 1.3, 1.7
-ag analog gainを小数に直して与える
-dg digital gainを小数に直して与える

これにより、一度自動調整を実行して取得したカメラ設定を使って連続して静止画を撮影することができます。
awb, agcを行う必要がなくなるため、撮影のインターバルを狭めることもできるようになります!

最終的な撮影コマンドを以下に示しておきます。xxxは適宜設定する値です。

raspistill -n -awb off -ex off -ss xxx -md xxx -o xxx.jpg -br 50 -awbg xxx,xxx -ag xxx -dg xxx -t xxx  

また自動調整時の実行コマンドも同様に示しておきます。

raspistill -set -br 0 -ex xxx

ここで、-exは露出設定です。autonightなど、シーンごとの設定が用意されているため、ここは使用する時間帯等に応じて変更できるようにしたほうが良さそうです。

システム構成図の落書き

以上を踏まえたシステム構成図の落書きを示します。
前回記事で明言したようにGo言語決め打ち!としたので、UIを配信するHTTPサーバと並行して動く撮影用goroutineを用意し、ユーザ操作によって撮影設定の自動調整(calibration)が指示されたときのみ、撮影設定を上書きするような構成とします。
このあたりの仕組はちょうど学習していたGo言語を使ったapi構築を応用してみました。

おわりに

raspistillのマニュアル撮影設定方法を調べるのが一番大変でした…。
なんとかシステム構成が決まりましたので、いよいよ実装→稼働です…!!