RaspberryPiでタイムラプス撮影

この記事では、ラズベリーパイを用いて、写真を定期的に撮り、その写真をタイムラプスとして保存するソースコードを紹介します。

因みに今回は、Pythonを用いています。Cでも同様にできると思います。

Pythonの環境設定

ラズベリーパイでは、デフォルトでPythonが入っているため、すぐに使うことができます。しかし、今回紹介するコードでは、cv2というモジュールがないと怒られるため、事前にを入れておきます。

$ pip install opencv-python

ソースコード

このソースコードは、1分間ごとにRaspberryPiで撮影してsnapshot.jpgとして上書きして出力しています。

# -*- coding: utf-8 -*-
import os
import cv2
import datetime
from time import sleep

cap = None
count=0
camera_port = 0   # USBカメラのデバイスは0 (/dev/video0)
cap = cv2.VideoCapture(camera_port)
while(True):
    ret, im = cap.read()
    tm=datetime.datetime.today().strftime("%Y/%m/%d %X")
    if ret==True:
        cv2.putText(im,tm,(20,450),cv2.FONT_HERSHEY_PLAIN,2,(255,255,0))
        file_name ="snapshot.jpg"
        print (file_name)
        cv2.imwrite(file_name, im)
        print("File written")
        sleep(60)
cap.release()
cv2.destroyAllWindows()

3行目、cv2モジュールは、pythonの画像処理では、専ら使うモジュールになります。
4行目、datetimeモジュールは、画像に日付を記載するのに用います。
5行目、sleepモジュールは、1分ごとに撮影する目的でプログラムを待機させるために用います。

10行目、カメラを起動させます。
11~22行目では、無限ループをしています。
12行目、を読み込んでいます。
14行目で、retが正常に読み込めていたら、次の処理を行います。
18行目、画像ファイルを保存します。
20行目、1分間プログラムを待機させます。

このソースコードを応用して、画像ファイルを連番で保存させるようにします。

また、以下のコードでは、10時から18時のみ連番で保存しています。

timelapse.py

# -*- coding: utf-8 -*-
import os
import cv2
import datetime
from time import sleep

cap = None
count=0
camera_port = 0   # USBカメラのデバイスは0 (/dev/video0)
cap = cv2.VideoCapture(camera_port)
while(True):
    date=datetime.datetime.today().day
    hour=datetime.datetime.today().hour
    ret, im = cap.read()
    tm=datetime.datetime.today().strftime("%Y/%m/%d %X")
    if ret==True:
        cv2.putText(im,tm,(20,450),cv2.FONT_HERSHEY_PLAIN,2,(255,255,0))
        file_name ="snapshot.jpg"
        print (file_name)
        cv2.imwrite(file_name, im)
        print("File written")
        if hour > 9 and hour <19:
            ftm=datetime.datetime.today().strftime("%Y%m%d")
            dir=datetime.datetime.today().strftime("%Y%m%d")
            newpath="/media/pi/ESD-USB/" + dir + "/"
            cv2.putText(im,tm,(20,450),cv2.FONT_HERSHEY_PLAIN,2,(255,255,0))
            os.makedirs(newpath,exist_ok=True)
            if count < 10:
                file_name = newpath  + ftm +"_"+"00"+str(count)+".jpg"
            elif count < 100:
                file_name = newpath  + ftm +"_"+"0"+str(count)+".jpg"
            else:
                file_name = newpath  + ftm +"_"+str(count)+".jpg"
            print (file_name)
            cv2.imwrite(file_name, im)
            print("File written")
            count+=1
        sleep(60)
        cdate=datetime.datetime.today().day
        if date!=cdate:
            count=0
cap.release()
cv2.destroyAllWindows()

RaspberryPiにカメラを装着

撮影するためのカメラを装着します。本記事では、USBのカメラではなく、Raspberry Pi カメラモジュールを用います。

上図のところにRaspberryPiカメラモジュールを入れます。

上図のようにつまんで引っ張りましょう。

このようになったら成功です。

実行

作ったソースコードのディレクトリに移動し、

$ python timelapse.py

このソースコードでは、Ctrl+Cなどをしない限り、ずっとプログラムが走ります。

あとは、画像をgifファイルかmp4ファイルにすればタイムラプスの完成です。

このことを応用して空を撮影しています。