以前、RaspberryPi と USB カメラで微速度撮影の実験を行いましたが、今回、USB カメラを複数台に増やして、パノラマ撮影+微速度撮影を行ってみました。
画角が連続するように配置した USB カメラ 3 台を用いて、部屋の窓から空の様子を 1 コマ/分で静止画撮影しました。その後、それぞれのカメラで同時刻に撮影された複数の画像を結合してパノラマ画像とし、最後にこれを動画に変換しました。
必要なものは USB カメラ 1 台で微速度撮影を行う時とあまり大きく変わりません。
前回はパッケージか何かで簡単にインストールできた記憶ようながあるのですが(失念)、現在はパッケージが見つかりません。なんでも、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 パッケージをインストール $ sudo apt-get install motion $ motion -h motion Version 3.2.12+git20140228, Copyright 2000-2005 Jeroen Vreeken/Folkert van Heusden/Kenneth Lavrsen
$ 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.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
framerate 2
でよい。framerate 10
では撮り損ねる
当初、コーナンで買ってきた激安の USB ハブを経由してカメラを接続していましたが、かなりの頻度でキャプチャに失敗していました。カメラ デバイスを開けずに灰色の画面になったり*3、キャプチャ画像に大きなブロックの乱れが入ったりして使い物になりませんでした。カメラ 3 台分の電源容量を心配してのことでしたが、試しに RasPi 本体の USB ポートに直接カメラを接続したところ、この不具合が全て解消してしまいました。USB ハブの転送速度がキャプチャに間に合っていない感じ?
これで USB ハブ無しなら最大 4 台まで、上質な USB ハブを用いればもっとカメラの台数を増やして全周パノラマ撮影なんて可能かもしれません。機会があれば試してみたいところです。やっぱり安物はアカンね(´・ω・`)