USB Web カメラの自動露出を固定に変更する
最初、OpenCVの機能でできるかと思ったけどやり方良くわからなかった。
v4l2-ctlコマンドを用いればできることがわかったのでやり方を述べる。
v4l2-ctlコマンドで露出を固定に
まずはv4l2が入ってないとどうしようもないので入れる。
$ sudo apt install -y v4l-utils
以下のコマンドでエラーが出ないことを確認。
$ v4l2-ctl --help
次にUSB Web カメラをPCに挿して、以下のコマンドで現在の状態を出す。
(なお、接続したカメラは/dev/video0であることを仮定している)
$ v4l2-ctl -d /dev/video0 --list-ctrls
brightness 0x00980900 (int) : min=-64 max=64 step=1 default=18 value=18
contrast 0x00980901 (int) : min=0 max=64 step=1 default=36 value=36
saturation 0x00980902 (int) : min=0 max=100 step=1 default=41 value=41
hue 0x00980903 (int) : min=-2000 max=2000 step=1 default=-206 value=-206
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
gamma 0x00980910 (int) : min=100 max=300 step=1 default=150 value=150
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=2
white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive
sharpness 0x0098091b (int) : min=1 max=7 step=1 default=2 value=2
backlight_compensation 0x0098091c (int) : min=0 max=3 step=1 default=0 value=0
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3
exposure_absolute 0x009a0902 (int) : min=3 max=2047 step=1 default=166 value=166 flags=inactive
focus_absolute 0x009a090a (int) : min=0 max=256 step=1 default=0 value=0 flags=inactive
focus_auto 0x009a090c (bool) : default=1 value=1
ここで見てほしいのは、
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3
この値が3だと自動露出、1だと固定露出となる。(どっかに規格かなんかあるんだろう、知らんけど)
よって、以下のコマンドで、固定露出に変えられる。
v4l2-ctl -d /dev/video0 -c exposure_auto=1 -c exposure_absolute=300
どの値が良いかは実際に設定して確認すればいい。
自動露出に戻したくなった場合は以下のコマンドで戻る。
v4l2-ctl -d /dev/video0 -c exposure_auto=3
以上!
OpenCV で read すると値が戻る
せっかく変更したのに、OpenCVでreadしたら戻っちゃった!
ということがある。
ぐぐったらカメラ固有の問題みたいだが、1度readしたあとに上記コマンドを実行したらちゃんと設定されるらしい。
コマンドは例えばpythonならsubprocessなどで上記コマンドを叩く、という方法で。