ラズパイ事始め(カメラ動かそ)

 


シゴトの関係で、カメラなどお勉強のため、ラズパイを勧められた。

仕事柄、会社の実験室にはその手の機材がゴロゴロ落ちているので、

あまり出だしから財布は傷まない。

ただ自分の性格からしてこれ、沼にハマる危険性は高いのですわ…

とりあえずBusterを立ち上げてみた。

会社でシゴト用のはPi4の4GB。
頂き物?はメモリ1GBのPi3…
カメラ(V2)だけ動かしているぶんには大した差はないが、
PCみたいにしだした途端、何気にこの落差は大きかった。

…きっとここが沼の一合目なんだろうなと、早くも実感した。

メモ

(色は…Bayer:BGGRの素の画像なので緑になるのが普通)
ちなみに、このスクショは自分にとっての重要なメモランダムである。
いや、欲しかった回答が全て入っていると言っても過言ではない(もう終わりかよ)。

自宅Pi3には、OSはBusterの最終版(2020-2-14)が入っている。
つまり今の自分にとって、カメラの静止画撮影コマンドはraspistillである。
(Buster上でLibCamera動くようにしちゃうとか、Pi3にブルズアイかち込むとかいろいろな猛者いますが、自分にとって本質ではないので正攻法でいきます)

仕事柄、おいらにとって大事なことは、
安定したセンサーすっぴん画像を取り出すことである。
キレイな良い絵を作る画処理プロフェッショナルは自分の後ろに
なんぼでもいるので。ただ、そういう頭のいい人たちは、
ハードウェアレイヤーのグダグダとは、一切関わりたくない方々なので、
自分みたいな水中土中で下支えする、泥臭いエンジニアが必要なんである。

BusterなのでRaspistill使うんですが、
このコマンドパラメータがめっちゃ曲者で、すくなくとも日本語サイトでは
初心者が正しく理解可能なサイトは(多分)ない印象。

paspistillコマンドに-setオプションあるでしょ…
これうまく使うと、"お前何やっとんねん?"が、ちょっとだけ垣間見えたりします。
-setオプションは画面にLOG吐けっていってるだけなんで、
当たり前だけど、他のオプションと組み合わせられます。

カメラ制御やりだすと、
ざっぱに言えば3Aとの戦いになるです(Android風に言えば)。
3Aとは、AF(Focus), AE(Exposure), AWB(White Balance)ですね。

AF

いまんところラズパイのV2カメラは機構的にMFなので、一個目のA(AF)はクリア出来ています。

AE

簡単に言うなら、やることは、露出オプションで機能を殺す…です。
-ex off

フィルム時代のカメラは、露出といえば、以下で決まりました。
1.シャッター
2.絞り
3.フィルム感度(ASAとかISOとか言ったアレ)

実は、イメージセンサーカメラも、モノは変われど考え方は大して変わらんです。
1.シャッター(-ss xxxxx)
2.絞り:固定(いわゆるスマホ系カメラはほぼレンズF値そのもの(=開放)です)
3.ISO、アナログゲインアンプ、デジタルゲインアンプがあります。

Raspistillのコマンド・オプションスイッチにはちょっとしたトリックがありました。
通常、AE機能は、シャッター速度と感度(ISO)を自動調整します。-ex offとやるとすべての自動化機能を失うようです。そこまでは想定の範囲でしたが、なぜか感度(ーISO)オプションを指定しても無視されている模様。そしてアナログゲイン(アンプ倍率)、デジタルゲインはいずれも内部的に1に固定されるようです(ちなみに、-ex off出ないときは、-ISO パラメタ指定はアナログゲイン値へダイレクトに反映されるようで、ISO 50=アナログゲイン1.0みたいです。つまり、-ex offに設定すると、ISOは50に固定となる。ここは仕様的に変な感じがするので、今後の改善を待ちたいです(とはいえ、多分に、内部の作りの都合が仕様として表に出ている印象あり…エンジニアあるあるです)。

なんとなくわかってきたのですが、未だに一つ理解不能なのが、-tオプション。恐らくなんか、内部制御との依存性が残っていて、仕様通りに機能出来ないケースがあるという印象あり。多分タイマーの起点か終点が間違ってるんじゃないかなーと言う印象あります(BUGは、いろいろな設定すると、なぜか画像ファイルが正しく作られない場合があるという点。時々真っ黒画像が出来上がります)。海外でもいろいろ語られていますが、謎だ…で終わってる。

露光手動、AWBオンだとこんな感じ

raspistill -ISO 50 -ss 50000 -awbg 1,1 -o xxxx5.jpg -set -t 200 -q 800 -md 0 -ex off

# 恐らく、-awbg1,1指定は、AWBオンなので無視されていると思う。ーISO 50も、-ex off指定が入っているので、言わずもがな内部で50に固定されていると思う。以下参照されたし。

pi@raspberrypi:~ $ raspistill -ISO 50 -ss 50000 -awbg 1,1 -o xxxx5.jpg -set -t 200 -q 800 -md 0 -ex off
Setting max quality = 100
Camera control callback  cmd=0x48435045mmal: Exposure now 49992, analog gain 256/256, digital gain 256/256
mmal: AWB R=303/256, B=760/256
Camera control callback  cmd=0x48435045mmal: Exposure now 49992, analog gain 256/256, digital gain 256/256
mmal: AWB R=303/256, B=760/256

(あー疲れた、続く)

その後色々判明したこと。

-ex が有効なときに、
● -ISOを指定すると、アナログゲインはISO指定値に追従し、デジタルゲインは1に固定される。
● -ISOを指定しないと、アナログゲインもデジタルゲインも、勝手に変わる(つまり、オートってことですね)

-ex offを指定すると、-ISOの指定も完全無視される。つまり、アナログゲイン=1=ISO 50、かつデジタルゲイン=1に固定される。

つまりだ、シャッター速度とISOをマニュアル指定して撮影画像の明暗の変化を実現したいときは、-ex offを指定してはいけなくて、-ssと、-ISOだけを指定すれば良い…ということらしい。

んー、フィルム写真をやっていた人にとってややこしいのは、フィルム時代にはあり得なかっった、ISO自動っていう変なものがあるってことですな。フィルム時代は、カメラに突っ込んだフィルムによって、それを取り出すまでISO値は固定されますからね。

話を単純にしましょう。
マニュアル露出撮影したいときは、
● -ex offには、”しない”(ISO指定が効かなくなるので)
● -ISOは指定する(これでデジタルゲインは1に固定化、アナログゲインはISO値が反映)
● -ss(露光時間=シャッター)は指定する

# ちなみに、ISO 50が、アナログゲイン1のようです。


ちなみに、AWB R=321/256, 683/256となっています。AWBが働いた証拠です。
(補正値で言うなら、R=1.254、B=2.667ってところ)

若干暗めですね

フルオートだと、本来?はこの明るさらしい





AWB

ふぃー、やっとここまで来た…

ここは比較的単純みたいです。
● -awb off
するだけ…ではなかった。
そうすると、カラーバランスを単純に取らなくなる(1:1:1)…というわけではなく、なんとG以外捨てちゃう!(0:1:0)…という暴挙に出てきます。

んでもって、AEが機能不全に陥って、真っ黒な画像を吐くようになる模様(なんでそういう作りにするのかな…)。

これを救うには、とりあえずRとBを捨てないように、-awbg 1,1を入れる。こうすると、とりあえずBayerのR,G,Bのカラーバランスを、1:1:1という前提で動き出すみたい(ただし色味はそれなり、AWBをオフにして1:1:1とか適当な値を入れたんだから…そのリカバリというか、責任は自分でちゃんと取りなさいよと言わんばかりに変な色出てきます。RAW撮影して、そのへんは現像のときにがんばりますわ…という方は、111でも入れておいて、後で現像頑張ってみてください。


はい、AWB R=256/256, B-256/256になっていますね。補正処理が止まった=テキトーに入れた(1:1:1になっている)という証拠です。

その結果、色はこういうことになります

ダカライワンコっちゃないので、正しい補正値を入れてみます。正しい値は、先程AWBオン状態のときのLOGに出ていましたね。

ちなみに、AWB R=321/256, 683/256となっています。AWBが働いた証拠です。
(補正値で言うなら、R=1.254、B=2.667ってところ)


んで、そのカラーバランス補正値を、-awbgオプションで正しく入れてみました。

ほらね、元に戻った…







Popular posts from this blog

ThinkPad にChromiumをインスコしてみた

スマホカメラ高解像度化?