安価なWebカメラC310をUSBでラズパイに接続して画像を取得する
カメラを使ってあれこれやりたいと思ったので、ラズパイに安価なWebカメラを接続して画像を取得してみました。
※公式のカメラも良いのですが、ちょっとお高めだったので。
なお、公式カメラ(ver.2)はSONY製800万画素のカメラなので、画質を求めるなら公式カメラをオススメします。
[kaereba_cam-c]
準備した物
- Raspberry Pi 3B (Raspbian 4.9.35-v7+)
- ロジクール HDウェブカム C310 (購入時 ¥1,994-)
[kaereba_cam-a]
ちなみに、ネットで調べたところロジクールのC270(¥1,699-)の使用例がたくさんあったので、これは人柱や!という気持ちでC310を試しています。C310とC270の違いも後半に記載しています。
UVC(USB Video Class)対応品であれば他の物でもたぶん大丈夫です。
接続&認識されたか確認
ウェブカムのUSBケーブルをラズパイに接続して、lsusbコマンドを実行します。
$ lsusb
Bus 001 Device 004: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
あっさり認識されていました。
静止画の取得(fswebcam)
早速写真を撮れるようにしていきます。プログラムで自動的に撮影することを念頭に、コマンドラインで静止画を取得できるようにします。
コマンドラインで使えるfswebcamのインストールと撮影
インストール
sudo apt-get install fswebcam
ref. USING A STANDARD USB WEBCAM
とりあえず撮ってみます。fswebcam image.jpg
$ fswebcam image.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image.jpg'.
デフォルトでは小さな画像(384×288)になります。
解像度を指定して撮影する
-rオプションを使うことで解像度を指定できます。
$ fswebcam -r 1280x720 image2.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image2.jpg'.
最大解像度で撮影してみます。
$ fswebcam -r 2560x1920 image-fhd.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 2560x1920 to 1280x960.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image-fhd.jpg'.
おや、、、大きさが変更されていますね(汗
2560×1920 → 1280×960
2560 x 1440 で再トライ!
$ fswebcam -r 2560x1440 image-l.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 2560x1440 to 1280x960.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image-l.jpg'.
。。。
どうやら、1280×960を超える物は撮れないようです。
いくつまで撮れるか確認してみます。
v4l-utils をインストール
sudo apt-get install v4l-utils
使えるフォーマットを表示してみます。
v4l2-ctl --list-formats-ext
ずらずらっと出力されて、
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 160x120
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
...
Size: Discrete 1184x656
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
結局、1280×960 までしかありませんでした (T-T)
ちなみに、lsusbコマンドでも確認できます。
lsusb -v |grep -1 Width
ref. Get max resolution of webcam?
連続撮影の注意点
連続して撮影しようとすると、このようなエラーが出ます。
--- Opening /dev/video0...
Trying source module v4l2...
Error opening device: /dev/video0
open: Device or resource busy
Trying source module v4l1...
Error opening device: /dev/video0
open: Device or resource busy
Unable to find a source module that can read /dev/video0.
fswebcam コマンドで撮影すると、実行終了後15秒程度はカメラがビジー状態になり、コマンドを実行しても撮影できないようです。
以下、試したけれど上手くいかなかった方法
別の情報で、パーミッションの影響もありそうだったので確認してみました。
$ ls -l /dev/video0
crw-rw----+ 1 root video 81, 0 3月 1 00:21 /dev/video0
読み書き権限を与えます。
$ sudo chmod a+rw /dev/video0
$ ls -l /dev/video0
crw-rw-rw-+ 1 root video 81, 0 3月 1 00:21 /dev/video0
結果、変わらず。
色々探していると motion が動いているとダメらしいとのことで、確認すると、、、
$ systemctl status motion
● motion.service - LSB: Start Motion detection
Loaded: loaded (/etc/init.d/motion)
Active: active (exited) since 水 2018-02-28 23:19:44 JST; 1h 23min ago
おお、動いている。。。
停止して、自動起動しないようにしておきます。
$ sudo systemctl stop motion
$ sudo systemctl disable motion
$ systemctl status motion
● motion.service - LSB: Start Motion detection
Loaded: loaded (/etc/init.d/motion)
Active: inactive (dead)
念のため再起動して確認
$ sudo reboot
結果、変わらず。
元に戻しておきました。
$ sudo systemctl enable motion
$ sudo systemctl start motion
おとなしく15秒ほど待つことにします。。。
ref. ラズパイ+Webカメラでタイムラプス撮影してみた 撮影設定編
バナーを消して撮影する
--no-banner を加えます。
$ fswebcam -r 1280x720 --no-banner image3.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to 'image3.jpg'.
C310 と C270 の違い
Logicoolのサイトから情報を探してきて比較してみました。
機種 | C310 | C270 |
---|---|---|
発売日 | 2010/08/27 | |
値段(記事執筆時) | ¥1,994- | ¥1,699- |
動画キャプチャサイズ | 1280×720 | |
フレームレート | 最大30fps | |
静止画キャプチャサイズ (ソフトウェア処理後) |
最大500万画素 2560 x 1920 |
最大300万画素 2048x1536 |
画素数 (センサー素子数) |
120万画素 | |
画質補正 | RightLight 2 | RightLight 1 |
[kaereba_cam-a]
[kaereba_cam-b]
RightLightは、画質補正をやってくれる機能で、C310の方が良いらしいです。
ロジクールRightLight™ 2テクノロジーにより、窓や照明が背景にあるような逆光の場合や、明るさが不足していたり、均一でなかったりする環境において露出を自動的に最適化します。
ref. プレスリリース ロジクール、フルHD対応、ステレオマイク内蔵のC910などHD対応ウェブカメラ新製品ラインナップ4機種6製品を発表
まとめ
ラズパイに安価なWebカメラを接続してfswebcamで簡単に写真を撮ることができました。
- 1280×960までしか撮影でず、c310の最高機能は引き出せませんでした (^^ゞ
- USBで接続する場合はもう少し安価なc270で良さそうです。
- また、fswebcamコマンドでは連続撮影は15秒おき程度が限界でした。
こうなると、公式カメラを試して見たくなりますね。
[kaereba_cam-c]
ディスカッション
コメント一覧
まだ、コメントがありません