この記事ではスマホなどのカメラ機能を用いず、自分でラズベリーパイを用いてタイムラプス動画を作成した方法を紹介します。実際に私が用いた機材や環境でタイムラプス動画を作成するとどのようになるか気になる方は実際に記事の冒頭で紹介しておりますのでそちらも併せてご参照ください。
この タイムラプス動画 の撮影のために必要な以下の項目について紹介しております。
・ラズベリーパイとUSBカメラで定期的に写真撮影するPythonのコード
・撮影された写真からタイムラプス動画を作成するPythonのコード
以下が実際にこの記事で紹介する機材、プログラミングコードで作成したタイムラプス動画です。証明のチラつきやカメラの画質など課題は様々ありますが、タイムラプス動画の形にすることが出来ました。
完成したもののイメージが沸いたところで本題に入ります。
ラズベリーパイとは
Raspberry Pi(ラズベリー パイ)は、教育で利用されることを想定して制作されたシングルボードコンピュータです。安価に入手できるシングルボードコンピュータとして趣味や業務(試作品の開発)等としても用いられております。略称としてラズパイとも呼ばれています。
Rasberry Pi 4 Model B (ラズパイ公式HPより)
ラズベリーパイは手ごろな価格で購入できるコンピュータですが、初めて使用する場合には設定を困難に思うことが多いでしょう。特に一番最初のOSをインストールしたmicro SDカードや、ラズベリーパイの規格に対応する電源、HDMI端子の用意などは手間なので初めて使用する人は必要な物一式がセットになっているパックを利用するのが早く確実です。
必要な機材などは揃っているよという人でも初めてラズパイを購入する場合・使用する場合には、どんなことができるかということを学ぶためにも書籍で網羅的に見てみるのがいいでしょう。私がはじめに購入した書籍は以下の2つです。
ゼロからよくわかる!ラズベリー・パイで電子工作入門ガイド
全ページカラーで、まだ図を多く用いているので初心者の私にも読みやすかったです。
RasberryPiで学ぶ電子工作
ブルーバックスから出ている書籍でこちらもフルカラーの書籍で見やすいです。ブルーバックスということで文庫本サイズで持ち歩きしやすく移動中などの細切れ時間を用いて学びたいという人におすすめです。
使用したUSBカメラ
今回撮影に用いたのは、エレコムの高画質HD対応200万画素Webカメラ「UCAM-C520FBBK」です。価格はamazonや楽天で約2,000円台で購入することが出来ます。画質の良いカメラはさらにお値段もするし今回は初めての試みだったので比較的安価な物を選択しました。
その他にもラズパイには専用のカメラモジュールが売られているのですが、こちらは比較的高価だったこととラズパイ本体につけるもののため少々取り回しが不便かと思い今回は見送りました。
ですが、ラズパイの中のPythonの「PiCamera」で比較的容易にコードで操作ができるため複数の記事でこのカメラモジュールを用いた事例を見かけます。
今回私が用いたUSBカメラではこのPiCameraを用いる方法では動作しないので注意が必要です。
撮影用スペースの作成
タイムラプス動画を作る時にはその撮影環境にも気を付けなければいけません。例えばカメラの位置がずれてしまったり、背景が変わってしまったり照明や明るさが変わるだけでもタイムラプス動画にした時に動画がちらついたりぶれたりしてしまいます。
そのため私は撮影用のスペースを用意することとしました。撮影用のスペースといっても手軽に用意したかったので100円ショップの材料で作製しました。
作成方法は以下の YouTube の動画を参考に作りました。
またこの YouTube の作成方法と異なる点としては、照明を USB ライトとしました。この USB ライトは Raspberry Pi の USB ポートから電源を供給しております。企画段階ではタイムラプスで例えば10分おきに撮影する設定にした場合に、照明やカメラの電源も撮影の直前にOnになるような省エネ設計を試みたかったからです。
ただ実際にはラズベリーパイ4ではUSBポートごとの電源のOn/Off制御が出来なかったため実際には常時ライトをつけた状態で撮影を行っておりました。
タイムラプス動画 の作成、撮影と編集
PythonのOpenCVとは
opencv とは Python の中のライブラリーの一つで画像・動画の撮影や編集を行うことができるライブラリーです。先ほども少し述べましたが Raspberry Pi には専用のカメラであるパイカメラモジュールがございますがそちらを用いる場合には、パイカメラ専用のプログラミングコードがあります。
今回私が用いたのは USB カメラのため、プログラミング制御するために Python の opencv を用いました。
なおRaspberry PiでPythonを使用するには「Thonny Python IDE」を使用します。
Pythonについては以下の記事で広く学習方法などをまとめているので興味がある人は参照してみてください。
USBカメラをセットする
タイムラプス動画を撮り始める前に、今の USB カメラの位置をセットします。その際には自分の画面上に今のカメラの映像を出したいために以下のコードを Raspberry Pi の Thonny Python IDEに入力して実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import numpy as np import cv2 import datetime cap = cv2.VideoCapture(0) while(True): ret, frame = cap.read() cv2.imshow('frame',frame) key = cv2.waitKey(1) # qキーが押された場合には終了する if key == ord('q'): break # sキーが押された場合には以下のpath名で保存される if key == ord('s'): # 現在の時間を取得する nowTime = datetime.datetime.now() # file nameを設定する path = "photo" + nowTime.strftime('%Y%m%d-%H%M%S') + ".jpg" cv2.imwrite(path,frame) cap.release() cv2.destroyAllWindows() |
そうすると画面上に「frame」というウィンドウが表示されてそこに USB カメラの映像が表示されます。 この時にキーボードの「s」を押すと今ウィンドウに表示されている物を画像として保存します。キーボードの「q」を押すとウィンドウが閉じます。
まずはこの状態で最適なカメラのポジショニングを行います。
OpenCVで10分置きに定点撮影
カメラのポジショニングが終わったら続いて撮影に移ります。タイムラプス動画を作る際には、ある一定間隔で撮影した画像をつなぎ合わせて一つの動画にします。そのため今回は10分おきに opencv を使って USB カメラでの撮影を行うコードを紹介します。
以下のコードを Raspberry Pi の Thonny Python IDEに入力して実行します。なおこのコードを使用すると撮影された画像ファイルはこのコードの保存場所のフォルダーに保存されます。タイムラプス動画を撮影していくと画像の枚数が増えますので予め写真保存用のフォルダを作成しておき、そこにこのコードを保存して実行するようにすると良いです。
私は Raspberry Pi に USB を挿して写真データを集めたいので、 USB メモリにこのコードを保存してプログラムを実行しております。そうすると Raspberry Pi の容量を気にせずにタイムラプス動画の撮影が続けられるためおすすめです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import numpy as np import cv2 import datetime import time cap = cv2.VideoCapture(0) while(True): ret, frame = cap.read() cv2.imshow('frame',frame) key = cv2.waitKey(1) # 現在の時間を取得する nowTime = datetime.datetime.now() # file nameを設定する path = "photo" + nowTime.strftime('%Y%m%d-%H%M%S') + ".jpg" cv2.imwrite(path,frame) time.sleep(600) cap.release() cv2.destroyAllWindows() |
このコードは10分間隔に撮影を行っておりますがその間隔を変更したい場合には、 ‘time.sleep(600)’の中の数字を変更してください。この中の数字は「秒数」を表しているため600秒、つまり10分間スリープすることを示しております。つまり1分感覚で写真を撮影したい場合にはこの括弧の中身の数字を「60」にすれば60秒間隔でスリープする設定に変更することができます。
OpenCVのタイムラプス作成
写真の撮影が終わって画像がたまりましたらいよいよタイムラプス動画の作成です。動画の作成にも opencv を使用します。 コードは以下に示しているものを使います。
またこのコードの中で「parameta」の項目の下にある「frame_size」,「 frame_rate」を設定します。画像の枚数にもよりますがframe_rateを変更することで画像を一枚一枚の表示時間を変更することができます。この値を変更することで、動画の全体の長さが2~3分になるよう設定してください。
また「frame_size」はタイムラプス動画のサイズ を決めます。今回私は USB カメラでの撮影であることに加えそこまで高画質が期待できなかったため「frame_size = 2」として 640 * 360 のサイズで作成しております。この値も「width」や「height」を変更することで変えられるので試してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import cv2 import glob import os import shutil import time """ parameta """ frame_size = 2 #FHD=0, 4K=1 frame_rate = 100 #FPS(10~100) """ end """ """ size set""" if frame_size == 0: #FHD Timelaps動画用 width = 1920 height = 1080 elif frame_size ==1: #4K Timelasp動画用 width = 3840 height = 2160 else: #小さめに作る width = 640 height = 360 """ """ def timelaps(images): fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter('timelaps.mp4', fourcc, frame_rate, (width, height)) print("動画変換中...") for i in range(len(images)): img = cv2.imread(images[i]) img = cv2.resize(img,(width,height)) video.write(img) video.release() print("動画変換完了") if __name__ == '__main__': start = time.time() # 降順にする場合にはsortedのreverse=Trueとする images = sorted(glob.glob('Photos/*.jpg'),reverse=True) print("画像の総枚数{0}".format(len(images))) timelaps(images) elapsed_time = time.time() - start print ("処理にかかった時間は:{0}".format(elapsed_time) + "[sec]") |
私は逆再生のタイムラプス動画を撮影したいため 57行目にて「sorted」の引数として「reverse=True」を指定しております。こうすることで動画ファイルの降順、つまり時間が最新のものから古いものになるように並び替えた上で画像を読みこみ動画変換しております。
通常通りのタイムスケールで タイムラプス動画を撮影したい場合にはこの「reverse=True」を消してください。
上記のコードを実行することで同じフォルダ中に以下のようなタイムラプス動画が出来ているはずです。
最後に
この記事ではスマホなどのカメラ機能を用いず、自分でラズベリーパイを用いてタイムラプス動画を作成した方法を紹介しました。タイムラプス動画の撮影のために必要な機器や撮影環境などをゼロから自分で作ってみましたが、まだまだ課題はあると思いつつもひとまず一つの形に出来たので満足です。
これから撮影する対象にあわせて環境を変えたり、いろいろと試しながら楽しんでいければと思います。
コメント
[…] life100create.com […]