安価なWebカメラC310をUSBでラズパイに接続して画像を取得する

2018年11月20日

カメラを使ってあれこれやりたいと思ったので、ラズパイに安価なWebカメラを接続して画像を取得してみました。

※公式のカメラも良いのですが、ちょっとお高めだったので。

なお、公式カメラ(ver.2)はSONY製800万画素のカメラなので、画質を求めるなら公式カメラをオススメします。

準備した物

  •  Raspberry Pi 3B (Raspbian 4.9.35-v7+)
  •  ロジクール HDウェブカム C310 (購入時 ¥1,994-)

ちなみに、ネットで調べたところロジクールの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 vs C270
機種 C310 C270
発売日 2010/08/27
値段(記事執筆時) ¥1,994- ¥1,699-
動画キャプチャサイズ 1280×720
フレームレート 最大30fps
静止画キャプチャサイズ
(ソフトウェア処理後)
最大500万画素
2560 x 1920
最大300万画素
2048x1536
画素数
(センサー素子数)
120万画素
画質補正 RightLight 2 RightLight 1

RightLightは、画質補正をやってくれる機能で、C310の方が良いらしいです。

ロジクールRightLight™ 2テクノロジーにより、窓や照明が背景にあるような逆光の場合や、明るさが不足していたり、均一でなかったりする環境において露出を自動的に最適化します。

ref. プレスリリース ロジクール、フルHD対応、ステレオマイク内蔵のC910などHD対応ウェブカメラ新製品ラインナップ4機種6製品を発表

まとめ

ラズパイに安価なWebカメラを接続してfswebcamで簡単に写真を撮ることができました。

  • 1280×960までしか撮影でず、c310の最高機能は引き出せませんでした (^^ゞ
  • USBで接続する場合はもう少し安価なc270で良さそうです。
  • また、fswebcamコマンドでは連続撮影は15秒おき程度が限界でした。

こうなると、公式カメラを試して見たくなりますね。

参考サイト