Raspberry Piで自動撮影してタイムスタンプ入りタイムラプス動画を生成する方法

はじめに

 この記事は、下記「電波ガーデニング」の一つの機能を実現するためのものですが、単独でも成立する記事にしていますので、「電波ガーデニング」をしたい人、タイトル通りのことだけやりたい人、両方の方が対象の記事となります。

 そうです。まさに今週のお題「植物大好き」です。

 もっと手軽に簡易版を作成したい方は、以下記事参照ください。

Raspberry Piで撮影からタイムラプス動画生成まで

 Raspberry Piでタイムラプス撮影して、PCに写真コピーして動画生成は何度かやったことあるのですが、Raspberry Piで動画生成まで完結できるとうれしいですねというわけでやってみました。動画生成以外は今までやったことの組み合わせです。

部品リスト(必要なもの)

 必要なものは以下です。カメラは、Raspberry Pi用のカメラモジュールを前提としています。

 Raspberry Pi 3

カメラモジュール

microSDカード

[asin:B00PTGO146:detail] 電源

Raspberry Piへの給電ケーブル。タイプAオス- マイクロタイプBオス

ハードウェアテスト

Raspberry Piセットアップとカメラテスト

 下記記事を参照に基礎的なセットアップ($ sudo apt-get upgradeするところ)まで完了させて下さい。カメラモジュールとRaspberry Piをフレキケーブルで接続することを忘れずに。

 その後、Raspi-configセットアップで、Interfaceのタブを開きカメラ(camera)Enableに設定して下さい。

 Raspberry Piを再起動した後、以下コマンドで撮影しましょう。

$ raspistill -o test.jpg

 エラーなく、test.jpgという写真ファイルが生成されればOKです。

Raspberry Piの自動撮影

 自動撮影のためのソフトは以前Raspberry Piでデジカメ作った時に作ったものを使い回しています。 http://karaage.hatenadiary.jp/entry/2014/09/19/113816

 ちょっとだけ自己満足的に改良していますが、機能、性能的には変わっていません。コードは以下にあります。

 以下コマンドでクローン(コピー)して

$ cd
$ git clone https://github.com/karaage0703/denpa-gardening.git

 以下コマンドで撮影できます。

$ python ~/denpa-gardening/shutter.py

 撮影したファイルは、~/denpa-gardening/photo_dataというディレクトリの中に保存されます。ファイル名は1から順に撮影のたびにインクリメントされていきます。数字をクリアしたい場合は、photo_dataというディレクトリの中にあるcamera.setというファイルにファイルNoが書かれているので、中身を手動で書き換えてください。

 更にcrontab -e実行して、末尾に以下追記すると10分ごとに写真を自動で撮影して保存するようになります。

*/10 * * * * python ./denpa-gardening/shutter.py

タイムスタンプ追加

 写真にタイムスタンプ(日付、時間)が刻印されていると後で見る時便利そうなので追加してみることにしました。

 以前妻のためにタイムスタンプを刻印するソフトをMac用につくったのですが(下記リンク参照)、フォントの場所の指定だけ変えてやれば、Raspberry Piでそのまま動きました。やったね。作っててよかった。なのでそれを持ってきます。

 以下コマンドを実行すれば、ファイルにタイムスタンプが自動で埋め込まれます。元には戻せないのでタイムスタンプ無しのも欲しい人はあらかじめどこかにバックアップを取っておいて下さい。

$ python ~/denpa-gardening/photo_exif_date_print.py <filename>

タイムスタンプ追加前

タイムスタンプ追加後

Raspberry Piで動画生成

avconvインストール

 Raspbian公式サイトの推奨はmemcoderのようなのですが、現在のRaspbian Jessieではインストールできなくなっています。色々調べたらavconvでやってうまくいっている人がいたようなので、avconvでやってみることにします。

$ sudo apt-get update
$ sudo apt-get install libav-tools

 ffmpegを自分でビルドして使っている人もいるようですので、興味ある方は本記事末にある参考リンク等を参照下さい。

avconvはffmpegに統合されたようなので、ffmpegを使うのが良いようです。

avconvで動画エンコード

 例えば、000001.jpgから000100.jpgのファイルが配置されている場合、そのディレクトリに移動して以下コマンドを実行します。

$ avconv -y -f image2 -r 10 -i %6d.jpg -aspect 16:9 -s '1980x1080' output.mp4

$ ffmpeg -y -f image2 -r 10 -i %6d.jpg -aspect 16:9 -s '1980x1080' output.mp4

 -r10がfps(フレームレート)です。その他のオプションはffmpegのドキュメントを参照ください。

 `output.mp4'という動画ファイルが生成されれば成功です。自分は最初うまくいかなかったので、うまくいっている人のオプションを参考にしてチャレンジしたら成功しました。

 動画は以下のような感じになります。

自動撮影から動画生成までの流れを自動化

 今までやってきた作業を自動化するmake-movie.shというスクリプトを作りました。使い方は以下のコマンドを実行するだけです。

$ ~/denpa-gardening/make-movie.sh

 スクリプトは以下の作業を行います。

  • photo_data以下にある画像ファイルを作業ディレクトリworkにコピー
  • workにある全ての画像ファイルにタイムスタンプを追加
  • workにある画像ファイルを動画ファイルにエンコードしてdenpa-gardeningディレクトリにoutput_日付.mp4というファイル名で保存
  • workディレクトリのファイルを削除

 タイムスタンプを追加するかしないか、動画のオプションなどはスクリプトの変数で変更できるようにしてあるので、興味ある方はスクリプトの中身をみて書き換えたりしてみるとよいかと思います。

 画像ファイルでディスクがいっぱいになる前に、定期的にスクリプト使って写真ファイルを動画にして、画像ファイルは以下コマンドで削除しておくとよいかもしれません。

$ rm ~/denpa-gardening/photo_data/*.jpg

まとめ

 基本的に今までやったことの組み合わせなので楽でした。タイムラプス動画は楽しいので、これだけでも色々使い道があるのじゃないかなと思います。

参考リンク

関連記事

変更履歴

  • 2020/05/22 動画エンコードソフトであるavconvのffmpegへの統合に伴いavconvをffmpegに変更