03-3258-1238
03-3258-1238平日9:00 ~ 18:00(土日祝日除く)
OpenCVなどのコマンドでカメラの設定を変更しようとした際に、そもそもその項目を変更できるカメラなのか、変更できる場合、どこからどこまでの値を設定できるのか、困ったことはないでしょうか。
本記事では、v4l2-ctlというコマンドを用いて、カメラの設定可能パラメータと範囲を確認し、変更する方法をご紹介します。
v4l2はVideo for Linux 2の略称で、Linux系OSをインストールしたPC上でUVCカメラを扱う際に使用するデバイスドライバ(機器を動かすためのソフトウェア)です。
v4l2は、プログラム(Pythonなど)から要求のあった処理をUVCカメラに伝えたり、UVCカメラの画像をプログラムに送る橋渡しの役割を担います。
また、v4l2は、カメラに/div/video*という名前をつけてコントロールするので、複数のカメラが接続された場合でも、カメラを識別して制御することが可能になります。
v4l2-ctlは、v4l2-utilsというユーティリティの機能の一つで、認識されたカメラデバイスの情報の表示と制御を扱うコマンドです。
(v4l2-utlisの機能には、他にもテストツールであるv4l2-compliance、レジスタ値の情報を直接取得するv4l2-dbgなどがあります。)
v4l2-ctlが使用できるPCはLinux系のOSがインストールされたPCです。
Linuxはオープンソース(プログラムが公開されている)であり、自由にプログラムを変更できるため、RedHat、Cent OS、Ubuntuといった複数のOSが存在しています。
小型PCであるRaspberry piにインストールすることが多い”Raspberry pi OS”もLinux系OSの一つなので、Raspberry Piでもv4l2-ctlを利用することが可能です。
v4l2-ctlが使用できるLinux OSの例
はじめてLinuxをインストールする方が、手持ちのPCで手軽に始めるのであれば、日本語に対応していてインストールもわかりやすい”Ubuntu”がおすすめです。
Windows PC上では、v4l2を使用することはできません。
ただし、1台のコンピュータにWindowsとLinuxの2つの異なるOSをインストールすることが可能です。 WindowPCに追加でLinuxをインストールすることが可能なので、「Windows PCを使用しているが、v4l2に興味がある」という方は、お試しください。
まずは、PCにv4l2-utilsをインストールします。
Linuxを使い慣れていない方は、「ターミナル(端末)」に馴染みがないかもしれませんが、ターミナルは、”さまざまなプログラムをコマンドで実行するためのアプリケーション”です。 ターミナルを開くためのショートカットは、「Ctrl+Alt+T」です。
sudo opt-get install v4l2-utils
「インストールコマンドの詳細」
sudo: 管理者権限でコマンドを実行するためのコマンド opt-get install:Linuxでネットワーク経由でパッケージのインストールを行う際に使用するコマンド v4l2-utils:インストールするパッケージの名前
ErrorやWarningが出力されなければ、インストール成功です。
カメラデバイスに設定できるパラメータの一覧を表示する-Lコマンドについて解説します。
v4l2-ctl –L
brightness 0x00980900 (int) : min=-64 max=64 step=1 default=0 value=0 contrast 0x00980901 (int) : min=0 max=100 step=1 default=50 value=50 saturation 0x00980902 (int) : min=0 max=100 step=1 default=64 value=64 hue 0x00980903 (int) : min=-180 max=180 step=1 default=0 value=0 white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1 gamma 0x00980910 (int) : min=100 max=500 step=1 default=300 value=300 gain 0x00980913 (int) : min=0 max=128 step=1 default=64 value=64 power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=2 white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=10 default=4600 value=4600 flags=inactive sharpness 0x0098091b (int) : min=0 max=100 step=1 default=50 value=50 backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=0 value=0 exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3 exposure_absolute 0x009a0902 (int) : min=50 max=10000 step=1 default=166 value=156 flags=inactive exposure_auto_priority 0x009a0903 (bool) : default=0 value=1 pan_absolute 0x009a0908 (int) : min=-57600 max=57600 step=3600 default=0 value=0 tilt_absolute 0x009a0909 (int) : min=-43200 max=43200 step=3600 default=0 value=0 zoom_absolute 0x009a090d (int) : min=0 max=3 step=1 default=0 value=0
1行目のパラメータに、brightness(明るさ)があるので、”明るさ”が変更できることがわかります。
そして、minの"-64"とmaxの"64"から明るさの変更範囲が、stepの"1"から変更できる間隔がわかります。また、defaultの"0"は初期値を、valueの"0"は現在の設定値を示しています。
また、同様に17個のパラメータが設定できることがわかります。ここで、exposure(露光)など、複数のパラメータが関連している項目があることに注意してください。露光の場合は、exposure_autoを無効である"1"にした場合にのみ、exposure_absoluteの設定値が有効になるなど、パラメータ間の関連があります。(exposure_autoは、3が自動、1が無効。)
より多くの情報を取得可能なオプション
--allオプションを使用すると、-Lオプションの情報に加えて、カメラのドライバー情報やビデオフォーマットの形式について確認することができます。
コマンド例:
v4l2-ctl --all
カメラデバイスを限定するオプション
複数のカメラデバイスを接続していて、1つのデバイスの情報だけを取得したい場合には、 -dオプションでカメラを限定できます。 この後解説する、”カメラの設定”でも有効なオプションです。
表示する情報を1つ目に接続したカメラ(/dev/video0)に限定する場合
v4l2-ctl -d /dev/video0 -L
まずは、圧縮方式と解像度とFPSの間にどのような関係があるかをまとめます。
【解像度vsFPS】 カメラデバイスが転送できる情報量に上限があることから、一般的には設定可能な解像度とFPSは反比例の関係になります。(解像度を高くするとFPSの最大値は低くなり、解像度を低くするとFPSの最大値は高くなります。)
【圧縮方式vs (解像度,FPS)】 圧縮率が高いと転送するデータ量に余裕ができるので、一般的には圧縮率の高い方式の方が高い解像度, 高いFPSが実現できます。
これらの関係から、カメラに設定できる圧縮方式、解像度、FPSの組み合わせを理解しておくことも重要です。 v4l2-ctlの--list-formats-extコマンドを使用して設定可能な解像度とFPSを確認する方法を解説します。
v4l2-ctl –list-formats-ext
ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'MJPG' (Motion-JPEG, compressed) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) (ー中略ー) Size: Discrete 1920x1080 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 2048x1536 Interval: Discrete 0.050s (20.000 fps) Size: Discrete 2592x1944 Interval: Discrete 0.100s (10.000 fps) [1]: 'YUYV' (YUYV 4:2:2) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) (ー中略ー) Size: Discrete 1280x720 Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.200s (5.000 fps) Size: Discrete 2048x1536 Interval: Discrete 0.250s (4.000 fps) Size: Discrete 2592x1944 Interval: Discrete 0.500s (2.000 fps)
まず、圧縮方式(画像のフォーマット形式)で出力が、大きく、[0]'MJPG' と [1]'YUYV' の2つに分かれています。
[0]'MJPG'の記載から、1920x1080の解像度まで30fps、2048x1536の解像度で20fps、2592x1944の解像度で10fpsと解像度を上げるとFPSが下がることがわかります。また、 [1]'YUYV'(非圧縮)の記載から、2592x1944の解像度で2fpsとMJPG(圧縮)に比べて1/5の速度しか実現できないこともわかります。
→MJPEGなど3形式を基礎から紹介
次に、確認したパラメータを実際にv4l2-ctlを用いて変更する方法をご紹介します。 v4l2-ctlでは、-cコマンドで直接カメラの設定を変更することができます。
-cコマンドの後に設定したい項目と数値を入力するだけです。 例えば、露光(brightness)を200に設定する場合には、以下のようにコマンドを入力します。
v4l2-ctl -d /dev/video0 -c brightness=200
設定後に-Lコマンドで設定を確認し、brightnessのvalueが200になっていれば、正しく設定されています。
電源を落とした際に、設定が保存されるカメラと保存されずにデフォルトに戻るカメラの両方があるので、注意が必要です。 これは、設定を書き込むメモリが揮発性の場合は、電源が落ちると変更した設定は消えますが、メモリが不揮発性の場合には、電源が落ちても変更した設定が消えないという違いがあるためです。
ここまでで、v4l2を用いたカメラの設定可能なパラメータの確認方法と設定方法を紹介しました。
v4l2-ctlは、「カメラの設定を変更したいが、設定範囲がわからない」、「設定したパラメータが有効にならないがそもそも設定できるのかわからない」というような場合に役にたつコマンドなので、ぜひお試しください。
ここで変更が可能ということが確認できたパラメータをOpenCV等で設定することも可能です。OpanCVでの設定に関しては、以下の記事をご確認ください。
→【Python×OpenCV】 カメラの設定を確認・変更する方法(解像度、明るさなど)
v4l2でカメラパラメータを確認
初めてのPythonガイド
初めてのOpenCVガイド
カメラの設定の確認・変更
カメラの設定Windowを簡単に出す
フレームレートの設定・確認方法
USBケーブルの延長方法
ハイスピードカメラとは
USBカメラの「ゲイン」設定
カメラの必要な画角
KLV大学マシンビジョンコース
詳細ページ