前回に続いてRaspberry PIのカメラを使いますが、これまでと違い今回使用するのは市販されている一般的なUSB接続できるカメラです。USB接続できるカメラは種類が多く用途に合わせて購入することができます。今回はこのUSBカメラをRaspberry PI 5に接続してコマンドを使って撮影します。なお、使用したUSBカメラは以下のものです。

・高画質HD対応200万画素Webカメラ(UCAM-C520FBBK)
https://www.elecom.co.jp/products/UCAM-C520FBBK.html
・高精細Full HD対応500万画素Webカメラ(UCAM-C750FBBK)
https://www.elecom.co.jp/products/UCAM-C750FBBK.html

前回と同様に撮影したデータはRaspberry PIのホームディレクトリにあるPicturesディレクトリに保存します。カレントディレクトリはこのPicturesディレクトリとします。コマンドならcd ~/Picturesです。映像もこのディレクトリに保存することとします。

接続したUSBカメラの確認

 まず、接続したUSBカメラがRaspberry PIで認識されているか確認します。以下のコマンドを入力します。USBカメラが接続され認識されていればカメラに関する情報(メーカー名やカメラ名など)が表示されます。

lsusb

 次に以下のコマンドを入力します。

v4l2-ctl --list-devices

今回接続したカメラは以下のように認識されています。

ELECOM 2MP Webcam: ELECOM 2MP W (usb-xhci-hcd.0-1):
    /dev/video8
    /dev/video9
    /dev/media4

カメラ情報は以下のコマンドで確認できます。

v4l2-ctl --all

ソフトウェアのインストール

 次にUSBカメラを制御するソフトウェア(fswebcam)をインストールします。(標準では入っていません)

以下のコマンドを入力します。

sudo apt install fswebcam

無事にインストールが終了したら以下のコマンドを入力してバージョンを確認します。

fswebcam --version

これで準備完了です。

静止画の撮影

 それでは静止画を撮影してみましょう。まず、以下のようにコマンドを入力するとカレントディレクトリに1.jpgという名前のJPEGファイルが保存されます。ただし、USBカメラが/dev/video0に接続されていない場合はエラーになり撮影は行われません。

fswebcam 1.jpg

 今回接続したUSBカメラは「v4l2-ctl --list-devices」として確認できる内容から/dev/video8のようです。この場合、fswebcamのdオプションを指定し、その後に/dev/video8と指定します。

fswebcam -d /dev/video8 1.jpg

撮影された画像には下にバナー(赤い線や文字)が入っています。これを表示しないようにするには--no-bannerを指定します。

fswebcam -d /dev/video8 --no-banner 2.jpg

撮影する画像のサイズを指定するには-rの後に320x240や800x600のように横幅x縦幅の形式で指定します。単位はピクセルになります。以下の例では横幅800ピクセル、縦幅600ピクセルで撮影されます。

fswebcam -d /dev/video8 --no-banner -r 800x600 3.jpg

一定時間ごとに撮影するには-lの後に秒数(間隔)を指定します。3を指定すると3秒ごとに撮影されます。なお、短い間隔を指定すると処理が間に合わずにエラーで撮影されないことがあります。撮影されなかった場合でも、以後の撮影は継続されます。撮影を停止する場合はControlキーを押したままCキーを押します。

fswebcam -d /dev/video8 --no-banner -l 3 4.jpg

ファイル名を指定すると、そのファイル名で上書きされます。Webブラウザ等で監視するような場合には便利かもしれませんが、継続して撮影した画像を保存したい場合には困ります。このような場合は以下のようにファイル名を日時にすることができます。

while true; do fswebcam -d /dev/video8 --no-banner "$(date +%Y%m%d_%H%M%S).jpg"; sleep 3; done

上記の場合、撮影するごとにファイルが増加してしまいます。そうではなくて過去数枚だけ残しておけばよいということもあります。例えばドライブレコーダーや監視カメラのような用途です。このような場合、以下のようにコマンドを入力します。以下の場合は0〜9までのファイル名で無限に繰り返し保存します。

i=0; while true; do fswebcam -d /dev/video8 --no-banner "$((i % 10)).jpg"; i=$(( (i + 1) % 10 )); sleep 3; done

100枚にしたい場合は以下のようになります。

i=0; while true; do fswebcam -d /dev/video8 --no-banner "$((i % 100)).jpg"; i=$(( (i + 1) % 100 )); sleep 3; done

映像の撮影

 次にUSBカメラで映像を撮影してみましょう。映像の撮影はfswebcamコマンドではできないため、ffmpegを使います。以下のようにすると10秒間撮影した後、カレントディレクトリに1.mp4という名前の映像ファイルが保存されます。

ffmpeg -f v4l2 -r 30 -i /dev/video8 -t 10 1.mp4

ファイル名を日付にしたい場合は以下のようになります。

ffmpeg -f v4l2 -r 30 -i /dev/video8 -t 10 "$(date +%Y%m%d_%H%M%S).mp4"

カメラが複数ある場合(USB)

 USBカメラを複数台接続して使用する場合、まず以下のコマンドを入力して、どのデバイスになっているかを確認します。ここでは仕様の異なるUSBカメラを2台接続しました。

v4l2-ctl --list-devices

/dev/video8が、これまで使用したUSBカメラで、/dev/video10が新たに接続したUSBカメラになります。fswebcamコマンドで撮影する場合は、このデバイス名を指定するだけで2台目のUSBカメラで撮影ができます。

fswebcam -d /dev/video10 --no-banner 2-1.jpg

カメラが複数ある場合(CSI)

 Raspbery PI 5本体にはカメラを2台接続できます。この場合、0番と1番にそれぞれカメラの番号が割り当てられます。ただし、設定によっては0番のカメラしか認識されない場合があります。

rpicam-hello --list-cameras

この場合、/boot/firmware/config.txtにあるファイル内容に2台目のカメラを認識させるための設定を追加する必要があります。
vi(vim)やnanoなどのエディタで編集します。

sudo vi /boot/firmware/config.txt

設定ファイルの文字の中からcamera_auto_detect=0を探します。

camera_auto_detect=0の後に以下の2行を追加します。なお、imx219は接続したカメラの型番になります。接続しているカメラに合わせて変更してください。

dtoverlay=imx219,cam0
dtoverlay=imx219,cam1

設定したらRaspberry PIを再起動します。

以下のコマンドを入力して、操作したいカメラの番号(一番左側に表示される値)を把握します。

rpicam-hello --list-cameras

番号を把握したらrpicam-stillコマンドでcameraオプションを使います。--cameraの後に対象となるカメラの番号を指定します。これにより2台のカメラを使い分けることができます。

rpicam-still --camera 0 --rotation 180 -o 0.jpg > /dev/null 2>&1
rpicam-still --camera 1 --rotation 180 -o 1.jpg > /dev/null 2>&1

Raspberry PI 5は処理速度も高速になっているのでカメラ映像をいろいろ処理してみると面白いでしょう。 では、また次回。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。