ケイエルブイは、ハイパースペクトルカメラ・光学部品・光源など世界中の光学機器を取り扱う専門商社です。

03-3258-1238

お問い合わせ
KLV大学 マシンビジョンコース

v4l2でUSBカメラの設定可能パラメータと範囲を確認

OpenCVなどのコマンドでカメラの設定を変更しようとした際に、そもそもその項目を変更できるカメラなのか、変更できる場合、どこからどこまでの値を設定できるのか、困ったことはないでしょうか。

本記事では、v4l2-ctlというコマンドを用いて、カメラの設定可能パラメータと範囲を確認し、変更する方法をご紹介します。

v4l2とは

v4l2はVideo for Linux 2の略称で、Linux系OSをインストールしたPC上でUVCカメラを扱う際に使用するデバイスドライバ(機器を動かすためのソフトウェア)です。

v4l2の役割

v4l2は、プログラム(Pythonなど)から要求のあった処理をUVCカメラに伝えたり、UVCカメラの画像をプログラムに送る橋渡しの役割を担います。

v4l2の役割(OSやプログラムとの関係)

また、v4l2は、カメラに/div/video*という名前をつけてコントロールするので、複数のカメラが接続された場合でも、カメラを識別して制御することが可能になります。


v4l2-ctlでできること

v4l2-ctlは、v4l2-utilsというユーティリティの機能の一つで、認識されたカメラデバイスの情報の表示と制御を扱うコマンドです。

(v4l2-utlisの機能には、他にもテストツールであるv4l2-compliance、レジスタ値の情報を直接取得するv4l2-dbgなどがあります。)

v4l2-ctlが使用できるPC(OS)

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の例

  1. RedHat Linux
  2. Cent OS
  3. Ubuntu
  4. Raspberry Pi

はじめてLinuxをインストールする方が、手持ちのPCで手軽に始めるのであれば、日本語に対応していてインストールもわかりやすい”Ubuntu”がおすすめです。

linux-logo.jpg
Windows PCでもデュアルブート化すればv4l2が使用可能

Windows PC上では、v4l2を使用することはできません。

ただし、1台のコンピュータにWindowsとLinuxの2つの異なるOSをインストールすることが可能です。
WindowPCに追加でLinuxをインストールすることが可能なので、「Windows PCを使用しているが、v4l2に興味がある」という方は、お試しください。


v4l2-ctlを使ったカメラデバイスの情報の表示と制御方法

v4l2-utilsのインストール

まずは、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の実行コマンド
v4l2-ctl –L
・出力の例(Optikron Lシリーズ 85-0023)
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

まずは、圧縮方式と解像度とFPSの間にどのような関係があるかをまとめます。

【解像度vsFPS】
カメラデバイスが転送できる情報量に上限があることから、一般的には設定可能な解像度とFPSは反比例の関係になります。
(解像度を高くするとFPSの最大値は低くなり、解像度を低くするとFPSの最大値は高くなります。)

【圧縮方式vs (解像度,FPS)】
圧縮率が高いと転送するデータ量に余裕ができるので、一般的には圧縮率の高い方式の方が高い解像度, 高いFPSが実現できます。

これらの関係から、カメラに設定できる圧縮方式、解像度、FPSの組み合わせを理解しておくことも重要です。
v4l2-ctlの--list-formats-extコマンドを使用して設定可能な解像度とFPSを確認する方法を解説します。

・v4l2-ctlの実行コマンド
v4l2-ctl –list-formats-ext
・出力の例(Optikron Lシリーズ 85-0001)
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の速度しか実現できないこともわかります。


v4l2-ctlを使ったカメラデバイスの設定の変更

次に、確認したパラメータを実際にv4l2-ctlを用いて変更する方法をご紹介します。
v4l2-ctlでは、-cコマンドで直接カメラの設定を変更することができます。

・v4l2-ctlの実行コマンド

-cコマンドの後に設定したい項目と数値を入力するだけです。
例えば、露光(brightness)を200に設定する場合には、以下のようにコマンドを入力します。

v4l2-ctl -d /dev/video0 -c brightness=200

設定後に-Lコマンドで設定を確認し、brightnessのvalueが200になっていれば、正しく設定されています。

v4l2-ctlで設定した設定はカメラに保存される?

電源を落とした際に、設定が保存されるカメラと保存されずにデフォルトに戻るカメラの両方があるので、注意が必要です。
これは、設定を書き込むメモリが揮発性の場合は、電源が落ちると変更した設定は消えますが、メモリが不揮発性の場合には、電源が落ちても変更した設定が消えないという違いがあるためです。

v4l2-ctlによるカメラパラメータの確認・設定のまとめ

ここまでで、v4l2を用いたカメラの設定可能なパラメータの確認方法と設定方法を紹介しました。

v4l2-ctlは、「カメラの設定を変更したいが、設定範囲がわからない」、「設定したパラメータが有効にならないがそもそも設定できるのかわからない」というような場合に役にたつコマンドなので、ぜひお試しください。

ここで変更が可能ということが確認できたパラメータをOpenCV等で設定することも可能です。OpanCVでの設定に関しては、以下の記事をご確認ください。

用語集

マシンビジョンコース

ご質問・ご相談お気軽にお問い合せください

お電話でのお問合せ 03-3258-1238 受付時間 平日9:00-18:00(土日祝日除く)
Webでのお問い合わせ