まなびサイエンス

RaspberryPi と USB カメラ ×3 台と motion でパノラマ微速度撮影

  • 公開 2016/11/05
  • 更新 2020/08/28
カバーイメージ
  • Trio
  • Photo by Ikhlasul Amal
    • CreativeCommons
    • Attribution
    • NonCommercial

 以前、RaspberryPi と USB カメラで微速度撮影の実験を行いましたが、今回、USB カメラを複数台に増やして、パノラマ撮影+微速度撮影を行ってみました。

タイムラプス動画

 画角が連続するように配置した USB カメラ 3 台を用いて、部屋の窓から空の様子を 1 コマ/分で静止画撮影しました。その後、それぞれのカメラで同時刻に撮影された複数の画像を結合してパノラマ画像とし、最後にこれを動画に変換しました。

材料

 必要なものは USB カメラ 1 台で微速度撮影を行う時とあまり大きく変わりません。

USB カメラ× 3 台 NEW
 適当な土台に USB カメラを並べて固定し、画角が連続するように角度を方向を調整します(右写真)。最後にそれを三脚に載せて完成です。今回は、リサイクルショップで大量に保護してあった PlayStation2 用の EyeToy USB カメラを使用しました。ホームセンターで買ってきた穴あきステーにガムテープ(!)で固定し、三脚にナットで留めています。
 左側のカメラと右側のカメラの軸が(たまたま)ほぼ直角なので、45度×3台=135度の視野がある計算です*1
RaspberryPi 2 Model B
 3 台同時撮影時のプロセス負荷は 12% 程度でしたので、初代無印モデルでも十分かもしれません。
motion
ImageMagick NEW
 それぞれのカメラで同時刻に撮影された複数の画像を結合してパノラマ画像を生成する際に使用します。
ffmpeg

手順

ffmpeg のインストール

 前回はパッケージか何かで簡単にインストールできた記憶ようながあるのですが(失念)、現在はパッケージが見つかりません。なんでも、Debian 開発チームと ffmpeg 開発チームの間でちょっとしたゴタゴタ(?)があったようで、Debian のパッケージから外れてしまったようです(´・ω・`)ナンテコッタ ...というわけで、ffmpeg はソースコードから自前でビルドする必要があります。詳しい手順はこのあたり↓を参照してください。make に 40 分くらい、make install に 20 分くらい要しました。

$ ffmpeg -version
ffmpeg version 3.2 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.2 (Raspbian 4.9.2-10)
configuration: --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree
libavutil      55. 34.100 / 55. 34.100
libavcodec     57. 64.100 / 57. 64.100
libavformat    57. 56.100 / 57. 56.100
libavdevice    57.  1.100 / 57.  1.100
libavfilter     6. 65.100 /  6. 65.100
libswscale      4.  2.100 /  4.  2.100
libswresample   2.  3.100 /  2.  3.100
libpostproc    54.  1.100 / 54.  1.100

motion のインストール

$ ### motion パッケージをインストール
$ sudo apt-get install motion
$ motion -h
motion Version 3.2.12+git20140228, Copyright 2000-2005 Jeroen Vreeken/Folkert van Heusden/Kenneth Lavrsen

ImageMagick のインストール

$ sudo apt-get install imagemagick
$ convert -version
Version: ImageMagick 6.8.9-9 Q16 arm 2016-09-23 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib

motion の設定

 動体検知に関連する機能は使わず、定期的にスナップショットを撮影・保存する機能を利用します。また、複数台のカメラで動作するよう、スレッドの設定を行います。
 基本設定やカメラで共通する設定を motion.conf に記述し、カメラ毎の設定を thread*.conf に記述します。

# 使用するビデオ入力の種類
input -1
# キャプチャ画像のサイズ [pixel]
width 320
height 240
# キャプチャ動作のフレームレート [fps]
framerate 2
# スナップショットを保存する間隔 [秒]
snapshot_interval 60
# キャプチャ画像に入れ込むキャプション文字列
text_left CAM%t
text_right %Y-%m-%d %H:%M:%S
# 画像や動画の保存先フォルダ
target_dir /home/pi/motion
# スナップショットの保存ファイル名
# カメラ番号(%t)ごとにファイルを分ける
snapshot_filename snapshot_%Y%m%d_%H%M%S_%t
# スレッドの指定
thread /etc/motion/thread1.conf
thread /etc/motion/thread2.conf
thread /etc/motion/thread3.conf
# カメラデバイスの指定
videodevice /dev/video0
# Webブラウザから画角調整やキャプチャ動作を確認できるようにしておく
stream_port 8081
videodevice /dev/video1
stream_port 8082
videodevice /dev/video2
stream_port 8083

スナップショットの撮影

 設定が終わったら motion を起動して、毎分ごとに /home/pi/motion にスナップショットが保存されていることを確認します。また、ライブカメラ機能を利用して、カメラの画角やピントを合わせ、スナップショットが撮り溜まるまでそのまま一日ほど放置します。

$ ### daemon モードで動作開始
$ sudo motion
$ ### キャプチャを停める
$ sudo killall -w motion

パノラマ画像の生成

 ImageMagick を利用して、それぞれのカメラで撮影された複数の画像を結合してパノラマ画像を生成します。パノラマ画像を生成する際には、元画像の結合順に注意する必要があります。特に USB カメラを抜き差しした際や、RaspberryPi の電源を入れなおした際など、どのカメラが何番のカメラ番号(/dev/video*)に割り当てられるか決定的ではないからです*2

$ for f in `ls -1 snapshot_*_1.jpg| sort`
    do
        BASE_NAME=${f%%_1.jpg}
        SAVE_FILEPATH=panorama/${BASE_NAME}.jpg
        echo $SAVE_FILEPATH
        # ImageMagick で画像をパノラマ結合(画像の結合順に注意)
        convert +append \
            ${BASE_NAME}_2.jpg \
            ${BASE_NAME}_1.jpg \
            ${BASE_NAME}_3.jpg \
            $SAVE_FILEPATH
    done

動画の生成

$ ### スナップショットから結合されたパノラマ画像が保存されたディレクトリに移動
$ cd /home/pi/motion/panorama
$ ### ファイル名を 0 始まりの連番ファイル名に変更する
$ ls -1| sort| perl -nle 'rename( $_, sprintf( "%04d.jpg", $.-1 ))'
$ ### 連番ファイル名の静止画を動画に変換する
$ time ffmpeg -f image2 -r 15 -i %04d.jpg -r 15 -an -vcodec libx264 -pix_fmt yuv420p video.mp4

覚書きやアイディア

  • 1 コマ/分の低速撮影なので framerate 2 でよい。framerate 10 では撮り損ねる
  • ちゃんとした USB ハブを利用してどこまで台数を増やせるか
  • Full HD 対応の USB カメラでどこまで画質が上げられるか
  • 周囲が暗い時、カメラの自動露出機能が働き、カメラの個体差でキャプチャ画像の明るさに差が出る。この機能を切れないか
  • cron を利用して撮影開始/停止/変換を自動化する
  • 気温/室温/風速などの各種環境センサを GPIO で接続してオーバーレイ表示。動画記録としての意味が高まるかも
  • 天候観測の際、撮影場所近辺の衛星画像をオーバーレイ表示

余談

 当初、コーナンで買ってきた激安の USB ハブを経由してカメラを接続していましたが、かなりの頻度でキャプチャに失敗していました。カメラ デバイスを開けずに灰色の画面になったり*3、キャプチャ画像に大きなブロックの乱れが入ったりして使い物になりませんでした。カメラ 3 台分の電源容量を心配してのことでしたが、試しに RasPi 本体の USB ポートに直接カメラを接続したところ、この不具合が全て解消してしまいました。USB ハブの転送速度がキャプチャに間に合っていない感じ?
 これで USB ハブ無しなら最大 4 台まで、上質な USB ハブを用いればもっとカメラの台数を増やして全周パノラマ撮影なんて可能かもしれません。機会があれば試してみたいところです。やっぱり安物はアカンね(´・ω・`)

  1. *1 つまり、8 台あれば全周をカバーできる計算?
  2. *2 udev 周りの設定をゴニョれば、カメラとデバイスの対応を固定できるかもしれない? 未調査
  3. *3 灰色一色のキャプチャ画像に UNABLE TO OPEN VIDEO DEVICE の文字

カテゴリー

過去ログ