TOP > 電子部品 > カメラ(OV7670) > 設定、ガンマ調整
(2020.12.20 作成)
導入のページでも書いたのですがこのサイトではOV7670をカメラとしてではなく、センサとして使用することを目標としています。
このため画像フォーマットは640x480pixel(VGA)のRAWフォーマットを使用しますし、あらゆる画像補正を使用せずにOFFにして使用します。そうすることでようやく入力の光量に出力が比例するので光センサとして使用することができるようになります。
OV7670 Implementation guideによるとブロックダイヤグラムは以下のようになっています。
大きくはAnalog Signal Processor部とDigital Signal Processor部に分かれています。
Analog部はさらにGain Control とBlack level calibrationに分かれていますが、このどちらも機能をOFFにします。まずAGC(Auto gain control)はレジスタCOM8[2]でOFFにできます。またABLC(Automatic black level calibration)はレジスタABLC1[2]でOFFにできます。
一方のDigital部はホワイトバランスなどいくつかの補正処理が入っています。ガンマを除くこれらの処理は基本的にデフォルトでOFFなのですが、ホワイトバランスだけは明示的にCOM8[1]でOFFにする必要があります。
またガンマカーブについてはデフォルトでは左図青のようなカーブになっているので赤色のような線形のガンマカーブにします。こうすることで入力の光量に対して出力値が比例するようになります。一方で画像としての見た目は黒つぶれしたような感じになります。
さて、このように調整した結果がどうなったのか実際に測定を行ってみます。これを実現するためにもう一つSTM32F103C8T6基板(偽MapleMini)を持ってきてLEDを点灯させる簡単な基板を作成しました。
単にPWMで調光するだけの簡単な回路です。PWMのデューティー比を変えることで明るさを変更できるようになります。この基板も同時にPCに接続してLEDの明るさを変更しつつカメラで自動測定を行うシステムを作成しました。頑張って作ったので自慢も兼ねてシステム図を載せます。
作成したシステムの構成図は右のようなものです。全体が複雑すぎて作ってい最中はかなり混沌としていました。管理人のオンボロPCではメモリも足りなくなってずっとHDDがガリガリ音を立ててますし。。。
LEDの光をライトボックスの天井にあて、その明るさをカメラで計測しました。そしてカメラ画像の縁で囲んだ部分の積分値を計算しました。
このシステムで入力と出力を測定した結果が右の図です。期待値は緑の破線のものですが、残念ながら出力階調が160を超えたあたりから線形性が保てなくなっています。
明らかに切れていない謎の画像処理が残っているようです。いろいろと設定値を変えて試してみたのですが原因不明です。
ここまで頑張ったのですが公開されている仕様以外の何かの処理が入っているような気がします。もうこれ以上は頑張るポイントがなさそうなので"あきらめて最大値が128階調以下になるように使う"というやり方でセンサとして使用するようにしたいと思います。