家で放置されてるラズパイ3を使って何か作ろうと思い、外を撮影したタイムラプス動画の作成に挑戦してみました。
※タイムラプスとは、一定時間毎に撮影した写真をつなぎ合わせてパラパラ漫画のような動画にしたものです。
説明しないもの
- ラズパイの初期設定
- Macからラズパイへのssh接続方法
環境
- ラズパイ3
- USBカメラ
- Mac
前提
- ラズパイにUSBカメラを接続して認識済み
- PCからラズパイに-Xでssh接続済み
今回はラズパイ3を使用していますが、ラズパイzeroやzerowでも可能です。
実装
準備
ラズパイにssh接続した状態で以下のパッケージをインストールします。
sudo apt-get install fswebcam feh libav-tools -y
- fswebcam : USBカメラ撮影
- feh : 画像確認
- libav-tools : タイムラプス動画への変換
撮影スクリプト
今回はシェルスクリプトで実装します。
(といっても1行の簡単なコードですが)
ssh接続したラズパイにcamera.shファイルを作成し、以下のコードを実装します。
fswebcam -r 1920x1080 --no-banner -D 2 Pictures/`date +%Y%m%d%H%M%S`.jpg
ファイル名はyyyyMMddhhmmss.jpgの形式になります。
あと、実行可能ファイルにするのをお忘れなく
chmod +x camera.sh
オプション説明
- -r : 撮影解像度サイズを指定
- --no-banner : 撮影情報テキストの表示無効
- -D : ディレイ値、2秒後に撮影
外を撮影する場合、重要なのは-D 2
オプションの遅延です。
この遅延なしで撮影すると、真っ白な画像になります。
どうやらUSBカメラが起動直後にカメラのピントやホワイトバランス?の自動調整が数秒行われるようで、調整完了を待ってから撮影する必要があります。
今回は2秒の遅延中にカメラの自動調整を待ち、撮影するといい感じの画像になりました。
(遅延値はUSBカメラにより違うと思います)
camera.shを実行すると無事に撮影できました。
撮影画像の確認
以下のコマンドで画像表示できます。
feh 画像ファイル名
連続撮影
準備
あとは撮影スクリプトを定期的に実行するだけです。
今回はcronで1分おきにcamera.shを実行して撮影します。
crontab -e
crontabに以下を追加しました。
*/1 * * * * /home/pi/camera.sh
撮影されているか確認すると、無事1分間隔で撮影されてました。
20171204231001.jpg
20171204231101.jpg
20171204231201.jpg
20171204231301.jpg
20171204231401.jpg
20171204231501.jpg
20171204231601.jpg
20171204231701.jpg
20171204231802.jpg
20171204231901.jpg
20171204232001.jpg
20171204232101.jpg
20171204232201.jpg
撮影開始
USBカメラとラズパイを外に向けて放置するだけです。
今回は家のベランダからコンセントに接続して撮影しました。
動画変換
放置して写真が撮り溜まったところで、タイムラプス動画に変換します。
ですが、タイムラプス動画に変換するためにはファイル名が連番になっている必要があるようです。
yyyyMMddhhmmss形式から変換する方法が分からないため、ファイル名をいったん0埋め5桁の00000からはじまる連番に変更します。
find . -name '*.jpg' | sort -n | awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %05d.jpg\n", $0,a++}' | bash
これでファイル名が
00000.jpg
00001.jpg
00002.jpg
00003.jpg
...
のように連番になりました。
その後、タイムラプス動画への変換コードを実行します。
ffmpeg -f image2 -r 15 -i %05d.jpg -r 15 -an -vcodec libx264 -pix_fmt yuv420p output.mp4
output.mp4が出力され、タイムラプス動画が作成できました。
完成
タイムラプス動画はscpでラズパイから取り出せます。
scp pi@raspberrypi.local:/home/pi/Pictures/output.mp4 .
動画はこんな感じになりました。
ラズパイ3とUSBカメラで空をタイムラプス撮影した pic.twitter.com/FHTAD8kSMk
— イケムラ (@ikemura_jp) 2017年12月5日
作り終えて
安いUSBカメラなので画質もそれなりでした。
キレイに撮影するには
-
fswebcam --list-controls
でカメラをチューニングする - 画質の良いカメラにする
- 一眼レフを使用する
このどれかが良いと思います。
今回はチューニング無しで撮影しています。
最近はスマフォでタイムラプス撮影が手軽にできますが、
ラズパイ+カメラ+モバイルバッテリーなら電池持ちも抜群に長く、撮影も変換も全て自動化できそうです。
撮影後にSNSへ自動投稿してSlackに通知、なんて事もできそうです。
色々カスタマイズして楽しめますね。