ラズパイで植物タイムラプス撮影【こどもちゃれんじ】

2021/06/07

IoT ガジェット ラズパイ 開発

ラズパイで植物タイムラプス

こんにちはイチケンです。

こどもちゃれんじの付録で植物育成セットが送られてきました。 本来オジギソウの種がついてくるらしいのですが、アメリカの場合は種無し!残念!
というわけでオジギソウの代わりに紫蘇を育てることにしました。

せっかくなので、成長していく過程を子供に見せたいと思い、ラズパイで記録してタイムラプス動画にします。

この記事でわかること

ラズパイとUSB-Webカメラでタイムラプス動画を撮影する方法と、USB-Webカメラ撮影画像が暗いときの対処方法がわかります。

  • fswebcamでUSB Webカメラ撮影
  • cronで10分毎実行
  • JPEG連番リネーム
  • ffmpegで連番JPEGをMP4化

撮影用シェルスクリプトを定期的に実行してJPEG画像を撮り溜め、その画像ファイル名を後で連番に一括で書き直し、連番画像をMP4に変換する、という手順です。

前提条件

まず前提条件となる私の環境です。

  • Raspberry Pi 4 Model B 8GB
  • Raspberry Pi OS 5.10.17-v7l+ Raspbian GNU/Linux 10 (buster)
  • fswebcam 20140113-2
  • ffmpeg 7:4.1.6-1~deb10u1+rpt1

機器の準備はこちらから

【IoT×キャンプ|機器準備編】意地でもラズパイとキャンプへ!らずキャン△プロジェクト|第1回

USB-Webカメラ

今回使用しているカメラはこちら。オートフォーカスや自動HD光補正など、高品質で撮影だけでなくリモート会議にも最適。三脚対応などタイムラプスに必要な機能もそろっており、マルチな一台としてオススメです。

ロジクールC920 PRO HDウェブカメラ、1080pビデオとステレオオーディオ

fswebcamでUSB Webカメラ撮影

fswebcamを使ったシェルスクリプトを作成します。まずはスクリプトで一回ポッキリ撮影してみましょう。

ラズパイ公式はこちら

Using a standard USB webcam

fswebcamインストール

まずはfswebcamをインストールします。LXTerminalで次のコードを実行。必要に応じてアップデートしてから実行してください。

sudo apt install fswebcam
fswebcamのインストール

撮影シェルスクリプト

ユーザーフォルダ(私の場合 home/ichi)に「shoot.sh」ファイルを作成して、テキストエディタ等で開いて以下のコードを書きます。

fswebcam -r 960x720 --no-banner -F 1 -S 120 Pictures/timelapse/`date +%Y%m%d%H%M%S`.jpg
シェルスクリプトの配置

フォルダを作成します。上のスクリプトの場合は、home/ichi/Picturesのフォルダ下にtimelapse(好み)を作ってください。タイムラプス出力する際にフォルダ内のJPEGを全てリネームします。そのため、この撮影用に新規フォルダを作成するようにしてください。

オプション解説

ラズパイ公式ではオプションがよくわからないので、こちらを参照したほうが良いです。

Ubuntu Manpage: fswebcam - Small and simple webcam for *nix.
  • -r 960x720: 解像度指定。あえて少し小さくしました。
  • --no-banner: バナーを消す。
  • -F 1: アベレージするフレーム数。デフォルト1なので入れなくても良いです。
  • -S 120: 起動後スキップするフレーム数。撮影合図も兼ねて長めに設定してます。通常は3くらいでOK。
  • Pictures/timelapse/`date +%Y%m%d%H%M%S`.jpg: 保存場所とファイル名

うまく撮影できないときは

fswebcamを使ってUSB-Webカメラで撮影する場合、フレームのスキップが重要になります。今回使用しているWebカメラの場合、最初の数フレームで明るさやピントを自動調整します。つまり最初の数フレームは使えません。

うまく撮影できない場合は、このスキップ設定(-S)または遅延設定(-D)を調整してみてください。

実行可能スクリプトに変更

シェルスクリプトを実行可能ファイルに変更します。

スクリプトファイルと同じフォルダで以下のコードを実行するか、右クリックでファイルのプロパティからパーミッションを変更します。

コードで変更

chmod +x shoot.sh

ファイルのプロパティから変更

shoot.shを「右クリック」→「ファイルのプロパティ」→「パーミッション」→「実行」を「すべて」などに変更。

実行権限の変更

動作確認

shoot.jpgをダブルクリックして「端末で実行」。スクリプトで指定したフォルダにJPEG画像が保存されれば成功です。

cronで10分毎実行

起動すると1回撮影するスクリプトができましたので、これをcronで定期的に実行して写真を取り溜めます。

LXterminalで以下のコマンドを実行します。

crontab -e
crontabで10分おきにシェルスクリプトを実行する設定

一番下に以下のコマンドを追記して、ご自身のファイルパスに変更して保存してください。そのままだとエディタはnanoだと思うので、「Ctrl+o」で保存。「Ctrl+x」で終了。

*/10 * * * * /home/ichi/shoot.sh

正しく動作すれば、10分ごとに撮影されます。

JPEG連番リネーム

頃合いを見て、画像をMP4に変換します。ffmpegを使いますが、連番だとffmpegでそのまま処理できます。というわけでファイル名を連番にするシェルスクリプトを作ります。

画像を保存しているフォルダ内に「rename.sh」ファイルを作成。

テキストエディタ等で開き、次のコマンドを挿入して保存。

find . -name '*.jpg' | sort -n | awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %05d.jpg\n", $0,a++}' | bash

shoot.shと同様に実行可能ファイルに変更して、実行するとフォルダ内のjpgファイルが00000.jpgスタートの連番ファイルになります。

変換前

連番に変換する前のファイル

変換後

連番変換後のファイル

ffmpegで連番JPEGをMP4化

連番JPEGファイルをタイムラプス動画へ変換します。

ffmpegインストール

もしffmpegが入っていないのでしたらインストールしてください。LXTerminalで次のコードを実行。アップデート兼ねてとりあえずインストールコマンドを実行してもOKです。

sudo apt install ffmpeg

動画変換シェルスクリプト

連番JPEGがあるフォルダ内に「convert.sh」ファイルを作成して次のコードを挿入。

ffmpeg -i %5d.jpg -vcodec libx264 -pix_fmt yuv420p -r 30 output.mp4 | bash

実行可能ファイルに変更後、実行するとMP4動画が出力されます。

完成した動画がこちら

オプション解説

参考にした公式サイト

ffmpeg Documentation

基本的な並びはこうです。

ffmpeg 入力オプション -i 入力ファイル名 出力オプション 出力ファイル名

五桁連番JPEGをH.264/MPEG-4 AVCコーデックでYUV420フォーマットの30fpsMP4ファイルに変換して出力する、という意味です。コーデックとフォーマット部分に関しては詳細を割愛します。多くの環境で再生できるおまじないみたいなもんです。どのような方式で圧縮して人の目を欺いて容量を減らすか、を指定しています。

H.264 - Wikipedia YUV - Wikipedia

最後に

いかがでしたか?連番変換とMP4変換のシェルスクリプトを少し応用するとタイムラプス動画出力も自動化できますね。必要に応じてトライしてみてください。

この記事が皆さんのお役に立てれば幸いです。

スポンサーリンク

フォロワー

Labels

Amazon (3) Apache (3) Apple (9) AppleSilicon (7) Bloggerカスタマイズ (12) EchoShow15 (1) IoT (25) Jetson (1) MySQL (1) PHP (3) Python (20) Web (3) アウトドア (11) アメリカ生活 (19) ガジェット (35) キャンプ (9) ディープラーニング (1) らずキャン△ (11) ラズパイ (24) 暗号資産 (5) 開発 (31) 旅行 (8)

QooQ