まなびサイエンス

RaspberryPi と USB カメラと motion で微速度撮影

  • 公開 2015/09/09
  • 更新 2017/02/07
カバーイメージ

 手持ちの RaspberryPi に、近所のハードオフで 108 円で買ってきた USB カメラを接続して低速度撮影の実験をしてみました。RaspberryPi を用いた場合、本体も非常に軽くコンパクトで、HDD のような可動部分もなく、USB 給電の 5V だけで動作するので、こういった実験には気軽に使えて最適です。また、撮影から動画生成に必要なツールも一式簡単にインストールできます。

タイムラプス動画

 部屋の窓から空の様子を 1 コマ/分で静止画撮影し、撮り溜めた静止画を結合して動画に仕上げてみました。秋雨前線のまっただ中のため曇り空しか映りませんでしたが、それでも雲の流れがよく判ります。晴れた日の空の方が、雲の動きが判りやすく面白い動画になると思います。

材料

RaspberryPi 2 Model B
 100 円ショップのカードケース入りの RaspberryPi です。今回は毎分の静止画撮影だけなので、スペック的には全くもって余裕がありました。
 スマートホンの充電用アダプタから 5V を給電するだけで動作しますし、USB-WiFi アダプタを接続すればネットワーク接続も OK、こういった実験であちこちに持ち運びできるコンピュータとしては最強かと思います。最悪ぶっ壊したところで数千円でから、屋外運用も十分可能で、小型のベアボーン PC ではこうはいきません。
PS2 EyeToy USB カメラ
 同じ USB カメラとしてジャンク箱に放り込まれている場合でも、明らかにパソコン用の USB カメラだと 324円や 540 円の値札が付けられていたりしますが、この EyeToy USB カメラは、旧世代ゲーム機の周辺機器として放置されているのか、近所のハードオフだと、大抵 108 円の捨て値で売られていたりします。かといって性能的には QVGA の一般的な USB カメラで、ドライバを突っ込めば普通に Windows マシンでも使えますし、RaspberryPi からも突っ込むだけで認識してくれます。画質を追求しない使途で USB カメラを必要とする場合、土台と雲台がしっかりした作りになっていて、むしろ敢えて他の USB カメラを選ぶ方が勿体ない感じです。発見された際には、ぜひとも保護してあげてください(笑)*1
motion
 motion は、カメラ画像をモニタして動体検出などを行えるパッケージです。カメラの前を何かが横ぎったタイミングだけ録画するなんていう監視カメラ システムを簡単に構築できます。今回は、motion の動体検知機能は使用せず、定期的にスナップショットを撮影する目的で利用しています。
ffmpeg
 撮影したスナップショットを連結して動画を生成するために利用します。先の motion パッケージを導入する際に一緒にインストールされますね。

手順

motion のインストール

 apt-get で必要な関連ツールなども含めて一発でインストールできます。ちなみに、別件で ffmepg をソースコードからビルドした際にはかなり時間がかかりました。今回はそこがメインではないので、簡単にパッケージからインストールするだけに留めます。

$ ### motion パッケージをインストール
$ sudo apt-get install motion
$ motion --version
motion Version 3.2.12
# uname -a
Linux raspi.dev 4.1.6-v7+ #810 SMP PREEMPT Tue Aug 18 15:32:12 BST 2015 armv7l GNU/Linux

motion の設定

 今回は使わないので、動体検知関係、動画保存関係のオプションを軒並みオフにして、スナップショットを保存する設定を有効にします。ライブ配信が本来の目的ではありませんが、ライブカメラ機能を利用してカメラの映像を確認できるようにしておくとセッティングが捗ります。

$ sudo vi /etc/motion/motion.conf
### カメラからキャプチャする画像サイズ
width 320
height 240
### 静止画キャプチャで負荷も問題なさそうなので少し高めにしてみた
quality 85
### MPEG 動画のリアルタイム変換は利用しない
ffmpeg_cap_new off
### スナップショットを60秒ごとに生成する
snapshot_interval 60
### 画像に挿入されるキャプション(右下)に日付と時刻を設定
text_right %Y-%m-%d\n%T
### 動体検知は使っていないので動体検知で変化した画素数を表示しない
text_changes off
### キャプチャ画像を保存するディレクトリ
target_dir /home/pi/motion
### スナップショットを保存する際のファイル名
snapshot_filename %Y%m%d/%H%M%S
### ライブカメラ機能で接続するポート番号
webcam_port 8081
### ライブカメラと制御パネルには localhost 以外からの接続を許可する
webcam_localhost off
control_localhost off

スナップショットの撮影

 設定が終わったら motion を起動して、毎分ごとに /home/pi/motion にスナップショットが保存されていることを確認します。ライブカメラ機能も生きているので、カメラの方向やピントの合わせを確認するには、別マシンから http://raspi.dev:8081/ にアクセスします。カメラのセッティングが済んだら、スナップショットが撮り溜まるまでそのまま一日ほど放置します。

### バックグラウンドで起動する。これでログアウトしても OK
$ sudo nohup motion &
### 止める場合、motion プロセスを探して
$ ps aux | grep motion
### Ctrl+C シグナルを送って止める。-KILL だと /dev/video0 を握りっぱなしになる?
$ sudo kill -INT 12345

動画の作成

 毎分毎に生成されたスナップショットの静止画を結合して動画を生成します。動画への変換には、motion のインストール時に併せてインストールされているはずの ffmpeg を利用します。

### スナップショットが保存されたディレクトリに移動
$ cd /home/pi/motion/20150908
### ファイル名を 0 始まりの連番ファイル名に変更する
$ ls -1 | 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
real    7m19.001s
user    7m16.980s
sys     0m0.420s

 スナップショットは日没後も深夜も構わず、真っ黒な画像生成されるので、日の出直前から日没後までの画像だけで動画を生成した方が良いでしょう。ffmpeg による動画への変換処理などを cron などで自動処理できるようにしておけば、空の様子を長期間に渡って録画&配信するような Web サーバも簡単に作れそうですね。

参考リンク

  1. *1 かくいう私も、気が付くと同じカメラを 4 台持っています...

カテゴリー

過去ログ