コンテンツにスキップ

Top

USB Web カメラの自動露出を固定に変更する

最初、OpenCVの機能でできるかと思ったけどやり方良くわからなかった。
v4l2-ctlコマンドを用いればできることがわかったのでやり方を述べる。

v4l2-ctlコマンドで露出を固定に

まずはv4l2が入ってないとどうしようもないので入れる。

1
$ sudo apt install -y v4l-utils

以下のコマンドでエラーが出ないことを確認。

1
$ v4l2-ctl --help

次にUSB Web カメラをPCに挿して、以下のコマンドで現在の状態を出す。
(なお、接続したカメラは/dev/video0であることを仮定している)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ 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

ここで見てほしいのは、

1
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3

この値が3だと自動露出、1だと固定露出となる。(どっかに規格かなんかあるんだろう、知らんけど)

よって、以下のコマンドで、固定露出に変えられる。

1
v4l2-ctl -d /dev/video0 -c exposure_auto=1 -c exposure_absolute=300

exposure_absoluteは固定にした露出値で、3〜2047までの値を選べれる。
どの値が良いかは実際に設定して確認すればいい。

自動露出に戻したくなった場合は以下のコマンドで戻る。

1
v4l2-ctl -d /dev/video0 -c exposure_auto=3

以上!

OpenCV で read すると値が戻る

せっかく変更したのに、OpenCVでreadしたら戻っちゃった!
ということがある。
ぐぐったらカメラ固有の問題みたいだが、1度readしたあとに上記コマンドを実行したらちゃんと設定されるらしい。
コマンドは例えばpythonならsubprocessなどで上記コマンドを叩く、という方法で。