概要
RaspberryPiでUSBカメラから画像を撮影する環境を構築しました。fswebcamを利用して撮影できることを確認しています。
最終的な環境は下記の手順で実現できます。
$ sudo apt install -y fswebcam
$ sudo usermod -aG vidoe $USER
$ fswebcam -p YUYV -r 640x480 -F 1 -S 20 --no-banner ./image.jpg
デバイスの接続状態確認
lsusb
でデバイスが接続されているかどうかが確認できます。
fswebcamのインストール
下記コマンドでfswebcamをインストールできます。
$ sudo apt install -y fswebcam
上記コマンドで導入しただけだと、fswebcamのコマンドで/dev/video
にアクセスできない場合があります。その場合は、Permission Deniedが発生するので下記コマンドでユーザをvideo
グループに追加します。初期設定のpiユーザだと不要かもしれません。
$ sudo usermod -aG vidoe $USER
撮影
画像の取得には下記のようなコマンドで実行します。
$ fswebcam ./image.jpg
fswebcamの設定では色々できるようですが、今回は下記のようなコマンドを利用して指定した解像度で取得するようにしました。
$ fswebcam -p YUYV -r 640x480 -F 1 -S 20 --no-banner ./image.jpg
-
-p YUYV
: カメラによっては、これがないと保存できない場合があるようです。 -
-r 640x480
: 640x640画素の画像を保存します。好きな値を設定してください。 -
-F 1
: 撮影するフレーム数です。おおよそ露光時間に関係する値のようです。
大きくすると露光時間が長くなり、動きがあるとぶれた画像になります。 -
-S 20
: 撮影前のパラメータ調整が行われるようです。
大きいほうが調整がいい場合があるようなのですが、時間がかかるようになります。 -
--no-banner
: バナーは邪魔なので削除。
docker環境
上記まででRaspberry Pi上での環境構築は完了なのですが、直接環境構築すると何かあった時に大変になるのでdockerで実現するための方法です。単純にfswebcamだけをインストールしたimageを用意し、コマンドを実行しています。
Dockerfile
ラズパイのイメージとしてはbalenalibを利用しています。
FROM balenalib/raspberry-pi:latest
RUN set -x \
&& apt-get update \
&& apt-get autoremove \
&& apt-get install -y fswebcam \
&& apt-get clean \
&& rm -rf /var/lib/apt/lits/*
WORKDIR /workspace
CMD ["fswebcam"]
実行には下記のようなコマンドを利用すれば撮影できます。localhost:fswebcam
は上記Dockerfileでビルドしたイメージを指します。
$ docker run --rm -v ./:/workspace --device=/dev/video0:/dev/video0 -u $(id -u):44 localhost:fswebcam fswebcam -p YUYV -r 640x480 -F 1 -S 20 --no-banner image.jpg
-
--device=/dev/video0:/dev/video0
: videoデバイスをdockerコンテナに接続します。- 環境によっては
/dev/viceo0
の末尾番号が異なる可能性があります。
- 環境によっては
-
-u $(id -u):44
: コンテナ内の実行ユーザIDとグループIDを指定します。- 設定せずに起動すると、rootユーザで画像が保存されます。
- グループIDはvideoデバイスに接続できるグループです。
cat /etc/group | grep video
で確認できます。
設定が正しくないと、videoにアクセスできずPermissionエラーが発生します。
docker-compose.yml
上記のコマンドを毎回利用してもよいのですが、大変なのでdocker-composeを用意します。
version: "2"
services:
fswebcam:
image: localhost:fswebcam
user: 1000:44
devices:
- /dev/video0:/dev/video0
volumes:
- .:/workspace:rw
working_dir: /workspace
command: fswebcam -p YUYV -r 640x480 -F 1 -S 20 --no-banner image.jpg
上記ファイルを用意して下記のコマンドを実行することで、docker run
と同様に動作します。
$ docker-compose run --rm fswebcam