Python
画像処理
ffmpeg
RaspberryPi

ラズパイで花が開花する様子をタイムラプス撮影する

やったこと

  • ラズパイとラズパイ標準カメラを使って10分に一回花の撮影をする
  • 撮影した画像をffmpegを使ってmp4(パラパラ漫画風)に変換

(クリックでYoutubeに飛びます)
IMAGE ALT TEXT HERE

IMAGE ALT TEXT HERE

結構お手軽にできます。

ラズパイとラズパイ標準カメラを使って10分に一回撮影する

やり方は方法などはこちらのブログからまるっと拝借しました

上記ブログで撮影用のコードも公開されているのでcloneしてきます

基本的には上記のコードを使って

$ python shutter.py

を実行すれば写真が1回分撮影されるので、cronを使って10分に一回 shutter.pyが実行されるようにします

crontabでcronのエディターを表示

$ sudo crontab -e

10分に一回撮影する場合は以下のように記述

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

ちなみに、もし10秒に一回撮影したい場合はこんなふうに指定するらしい

* * * * * for i in `seq 0 10 59`;do (sleep ${i} ; python /home/pi/denpa-gardening/shutter.py) & done;

crontabの記述が正しく書けた場合は保存してエディターを閉じると 「新しいラインを記録したよ」みたいな表記がでる

これで撮影された画像は photo_dataディレクトリ下に格納されていきます。

トップページに貼ったヒヤシンス動画の場合、約3週間弱の期間を10分間隔で撮影し続け、得られた2000枚ほどの画像から作成しています。

撮影した画像をffmpegを使ってmp4に変換

撮影したjpeg画像をパラパラ漫画のように繋げて、(タイムラプス)動画を作成します。linuxのコマンドツールであるffmpegを利用します。

自分の場合は、ラズパイへscpして photo_data下の画像を全て母艦のMacに転送しました。ffmpegの処理がそこそこ重いのでMacへ移動させましたが、そこまで多くの画像枚数が無いのであればラズパイ上で画像→動画作成の処理をしても良いかもしれません。その場合はこちらのブログを参考にしてavconvで作成してみてください。

以下はffmpegを使う場合です。

# 例
$ ffmpeg -f image2 -r 30 -i %04d.jpg -r 30 -an -vcodec libx264 -pix_fmt yuv420p video.mp4

ここで生成されるvideo.mp4が目的のタイムラプス動画となります。

ffmpegの引数について

それぞれのパラメータの意味はこちらを参照

ここで最も重要なパラメータは -r-iです。

-rは1秒間を何フレームで表現するかという引数です。

上記例では30としているので30フレームが1秒となる動画が作成される。撮影時は10分で1フレームを撮影していたので、30フレームは300分=5時間、つまり5時間を1秒に圧縮したタイムラプス動画を作成することになる。

-iは静止画名を表す表記の仕方で、%04dで4桁、%05dで5桁の数字を表します。

上記例では 0000.jpgから9999.jpgまでのファイル名を指定していることになります。最も注意すべき点としては、ffmpegは-iで指定するファイル名を0001から始まる連番にしなければいけないです。ただ単に連番にするだけでなく、0001から始めないといけないのがポイント。

仮に、途中に存在する余計なフレームを削除したりして完全な連番でなくなった場合は新たに全ファイル名をrenameして0001から始まる連番にしないといけません。そんなときはMacであれば homebrewでinstallできるrenameコマンドなどがオススメ。使い方は簡単です。

$ brew install rename
# 例
$ rename -N 0001 -X -e '$_ = "$N"' *.jpg

-Nでスタートする番号を指定します。ここでは0001をスタートとして指定したので、0001.jpg~9999.jpgに一括でファイル名をrenameしてくれます。