Prismjs

2021年7月6日火曜日

v4l2-ctlでUSBカメラの設定を変更する

v4l2-ctlを使ってUSBカメラの設定変更をした。

まずはインストール

sudo apt install v4l-utils


接続しているUSBカメラの設定項目を確認する

sudo v4l2-ctl -d デバイス -L

下記のように接続した該当デバイスの設定可能な項目一覧が表示される
dora@dora:~$ sudo v4l2-ctl -d /dev/video0 -L
                     brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast 0x00980901 (int)    : min=0 max=95 step=1 default=1 value=1
                     saturation 0x00980902 (int)    : min=0 max=100 step=1 default=64 value=64
                            hue 0x00980903 (int)    : min=-2000 max=2000 step=1 default=0 value=0
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                          gamma 0x00980910 (int)    : min=100 max=300 step=1 default=100 value=100
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=1 value=1
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      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=1 step=1 default=1 value=1
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=3 max=2047 step=1 default=166 value=166 flags=inactive
                 focus_absolute 0x009a090a (int)    : min=0 max=1023 step=1 default=0 value=275 flags=inactive
                     focus_auto 0x009a090c (bool)   : default=0 value=1

minが最小値、maxが最大値、step単位で設定でき、defaultは接続したときに設定される値で、valueが現在値を示している。カメラの種類によって設定できる/できない項目もあり、設定できない項目は表示されない。
flags=inactiveがついている項目は現在の設定のままでは変更できない。例えばフォーカス(focus_absolute)はオートフォーカス(focus_auto)が有効になっていると設定できない。


設定値を変更する

sudo v4l2-ctl -d デバイス -c 設定項目名=設定値

設定例:
dora@dora:~$ sudo  v4l2-ctl -d /dev/video0 -c contrast=15

flags=inactiveがついている項目を変更しようとしても下記のようにエラーが出る
dora@dora:~$ sudo v4l2-ctl -d /dev/video0 -c focus_absolute=120
VIDIOC_S_EXT_CTRLS: failed: Invalid argument
focus_absolute: Invalid argument
この場合、focus_autoを0にするとflags=inactiveが非表示になり設定できるようになる。
dora@dora:~$ sudo v4l2-ctl -d /dev/video0 -c focus_auto=0
dora@dora:~$ sudo v4l2-ctl -d /dev/video0 -L
                     brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=0
省略
              exposure_absolute 0x009a0902 (int)    : min=3 max=2047 step=1 default=166 value=166 flags=inactive
                 focus_absolute 0x009a090a (int)    : min=0 max=1023 step=1 default=0 value=275
                     focus_auto 0x009a090c (bool)   : default=0 value=0
dora@dora:~$ sudo v4l2-ctl -d /dev/video0 -c focus_absolute=120

露出設定時の注意点

露出の設定(exposure_autoやexposure_absolute)は一度設定してもOpenCVでVideoCapture 後の初回のread時になぜかリセットされてしまう現象が発生した。そのため一度初回にreadし読み捨て、リセットされた後にexposure_autoやexposure_absoluteの設定を行うことで不具合回避することができた。ffmpegなどを用いた場合も起動後に露出設定しないと起動時に露出設定がリセットされてしまいうまく反映されなかった。
焦点距離(focus_auto、focus_absolute)などはリセットされることはなかった。
手持ちのUSBカメラではすべて同様の現象が発生したが、発生するカメラと発生しないカメラがあるらしい。

0 件のコメント:

コメントを投稿