Introduction
備忘録。
Windows だと何も考えずにカメラを使えるが、Linux ではそうもいかない。
例えば、下記のようなコードも
1 |
|
実行すれば
1 | [ WARN:0] global ../modules/videoio/src/cap_v4l.cpp (887) open VIDEOIO(V4L2:/dev/video1): can't open camera by index |
こんな感じでエラー。
Why?
単純に権限がない。
Linux の場合、カメラデバイスはデバイスファイルとして /dev/video0
や /dev/video1
として認識される。
これらの権限が
1 | ls -la /dev/video* |
のようになっており、オープンするには
root
ユーザvideo
グループに所属
である必要がある。
How to resolve?
今回は video
グループに追加する。
1 | sudo usermod -aG video $USER |
ちなみにグループに追加後は再度ログインしなおす必要があるので、リモートならつなぎなおす等する。
だが、Visual Studio Code のリモート接続を使用している場合、つなぎなおしても、セッションが維持されているのか反映されない。
video
グループに追加後
1 | ./camera |
Not friendly!
そもそも、エラーの内容が不親切。
デバイスファイルを開けないので、can't open camera by index
というのはわかるが、これではまるで指定したデバイス ID が間違っているかのような印象を受ける。
ちなみにバックエンドに Gstreamer
を指定した場合も似たような感じ。
1 | [ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1758) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Could not open device '/dev/video0' for reading and writing. |
せめて、デバイスファイルは存在しているから権限がないよ、くらいは教えて欲しい。
ただ、v4l2-ctl
でデバイスの確認をするとき、video
グループに所属していなかったりすると
1 | v4l2-ctl --list-devices |
ちゃんと権限がないことを教えてくれる。