タイムラプス(一定間隔で撮影)v2.0

ラズパイカメラを使って、月の動きや雲の変化など、長時間の変化を短時間ムービーで観察しよう

研究手順

  1. タイムラプスとは何か
  2. Raspberry Pi とカメラの準備
  3. Pythonコード1:一定間隔で写真を撮影する
  4. Pythonコード2:画像を繋げて、動画をつくる
  5. 自分だけのタイムラプス作品をつくる(影, 雲, 植物 等)

タイムラプスとは何か

例えば1分間毎にカメラ撮影して、その画像をつなぎ合わせると短時間のビデオで長時間の変化を観察できる

  • 太陽の動き・影の変化を観察(1分間隔で1時間撮影。影の長さや向きが変わる様子)
  • 雲の動きの観察(10秒間隔で10分撮影。雲の形や風の流れがよくわかる)
  • 植物の成長観察(30分~1時間間隔で数日間撮影。)

Raspberry Pi とカメラの準備

ラズパイ基盤に、ラズパイ専用カメラを取り付ける

カメラがデバイスとして認識されていることを検査する

カメラデバイスが認識されるかテスト

$ vcgencmd get_camera

supported=1 detected=0, libcamera interfaces=0
         ↑ ここを見る
supported=1 detected=0 #認識されてない
supported=1 detected=1 #認識された

カメラで撮影できるかテスト

$ raspistill -o test.jpg

Pythonコード1:一定間隔で写真を撮影する

目標:Raspberry Pi と Python を使って 一定間隔で写真を撮影するプログラム を作れるようになる

前提:CoderDojo青梅のSDカードを使っていれば、カメラ撮影のOpenCVライブラリはインストール済み

機能:time.sleep() を使って 5 秒ごとに撮影。ファイル名は日時入りで保存。画像の向きはcv2.rotateで調整。

pythonディレクトリで、新しいファイルを作成する[$ nano timelapse.py]

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import os
import time
import datetime

# 保存先ディレクトリ
SAVE_DIR = "/home/pi/python/timelapse_pics/"
INTERVAL = 5   # 撮影間隔(秒)あとで変更可能

def main():
    # 保存フォルダがなければ作成
    if not os.path.exists(SAVE_DIR):
        os.makedirs(SAVE_DIR)

    # カメラを起動
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("カメラが見つかりません。USBカメラを確認してください。")
        return

    print("タイムラプス撮影を開始します。Ctrl+C で終了できます。")

    try:
        count = 0
        while True:
            ret, frame = cap.read()
            if not ret:
                print("画像が取得できませんでした。")
                break

            # 必要なら回転(あなたの環境に合わせて)
            frame = cv2.rotate(frame, cv2.ROTATE_180)

            # ファイル名(日時入り)
            now = datetime.datetime.now()
            filename = "pic_{0:%Y%m%d_%H%M%S}.jpg".format(now)
            filepath = os.path.join(SAVE_DIR, filename)

            # 保存
            cv2.imwrite(filepath, frame)
            count += 1

            print(f"{count}枚目を撮影しました:{filepath}")

            # 次の撮影まで待つ
            time.sleep(INTERVAL)

    except KeyboardInterrupt:
        print("\n撮影を終了します。")

    finally:
        cap.release()
        cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

保存したら実行してカメラ映像を撮影する。

$ python3 timelapse.py

ディレクトリ[/home/pi/python/timelapse_pics]に保存されている、画像ファイル[pic_xxxx.jpg]を確認する。

(カスタマイズ)撮影間隔を変更するには秒数を変更する

INTERVAL = 10   # 10秒ごとに撮影

Pythonコード2:画像を繋げて、動画をつくる

目標:撮影した画像をつなげて タイムラプス動画を生成 できる

機能:OpenCV の cv2.VideoWriter を使う。画像サイズを自動取得して、FPS動画速度(1秒当たりの画像数)を指定してビデオ作成

pythonディレクトリで、新しいファイルを作成する[$ nano timelapse_make_movie.py]

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import os
import glob

# 画像が保存されているフォルダ
IMG_DIR = "/home/pi/python/timelapse_pics/"

# 出力する動画ファイル名
OUTPUT_FILE = "/home/pi/python/timelapse_timelapse.mp4"

# 動画のフレームレート(1秒あたりの画像枚数)
FPS = 30


def main():
    # 画像ファイル一覧を取得(日時順に並ぶようにソート)
    img_files = sorted(glob.glob(os.path.join(IMG_DIR, "*.jpg")))

    if len(img_files) == 0:
        print("画像が見つかりません。撮影スクリプトで画像を作成してください。")
        return

    print(f"{len(img_files)} 枚の画像を動画にまとめます。")

    # 最初の画像からサイズを取得
    first_img = cv2.imread(img_files[0])
    height, width, channels = first_img.shape

    # 動画ファイルの設定(mp4)
    fourcc = cv2.VideoWriter_fourcc(*"mp4v")
    video = cv2.VideoWriter(OUTPUT_FILE, fourcc, FPS, (width, height))

    # 画像を順番に動画へ追加
    for i, img_path in enumerate(img_files):
        img = cv2.imread(img_path)
        if img is None:
            print(f"読み込み失敗: {img_path}")
            continue

        video.write(img)
        print(f"{i+1}/{len(img_files)} 枚目を追加しました")

    video.release()
    print(f"動画を作成しました:{OUTPUT_FILE}")


if __name__ == "__main__":
    main()

保存したら実行して画像をつなぎ合わせて動画を作成する。

$ python timelapse_make_movie.py

動画を再生してみる。VScodeの場合は、Windowsへダウンロードする。

(カスタマイズ)1秒当たりの画像数FPSを変更する

FPS = 10

自分だけのタイムラプス作品をつくる(影, 雲, 植物 等)

太陽の動きによる影の変化など、観察するプロジェクトを発表する

コメントを残す