【初心者】ラズパイでタイムラプス動画を作成する

# 1. はじめに

- 朝起きてみたら庭の花がたくさん咲いてて、、ということがあり、寝てる間にどれくらい開花が進むのかタイムラプスして確認してみることにする。

# 2. やったこと
- 古いラズパイ(Raspberry Pi3 Model B)のOSを再インストールし、古いUSBカメラ(BUFFALO BSWHD06M)を接続する。
- 定期的に花の写真を撮影し、タイムラプス動画にする。
- 初めての成果。動画の上のほうで2つ開花しているのが確認できる。ダンゴムシがもそもそしているのも気になるが、、

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/2ed75724-edf3-8264-941c-1803e0ccf633.gif)

# 3. 手順
## 3.1 RasbianOSのインストール

- 「Raspberry Pi Imager」という、OSイメージのダウンロードからSDカードへの書き込みまで一発で全てやってくれる公式のツールを使用する。
    - 参考：「[Raspberry Pi OSのインストール – 公式Imager対応](https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-os%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)」

- 2023/6時点で最新のbullseyeをインストールする。

```
mksamba@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
```

## 3.2 作業環境整備
- ラズパイにずっとキーボード、ディスプレイ、マウスをつなげているのも不便なので、リモートから操作できるようにする。
- ラズパイは家のWifi経由でインターネット接続する。同じく家のWifi経由に接続されている作業用PCから、「RealVNC Viewer」を用いて接続する。
    - 参考：「[【ラズベリーパイを遠隔操作】VNCでＰＣからリモート接続する方法](https://sozorablog.com/vnc/)」

![2023-07-08-000315_1024x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d0912937-a103-f207-5312-3b0f13a8f0d2.png)

## 3.3 カメラの接続

- USBカメラ(BUFFALO BSWHD06M)を接続する。USBポートにつなぐだけで認識される。
    - 参考：「[【Raspberry Pi】 ラズパイにWebカメラを接続する方法](https://hitori-sekai.com/tool/raspberrypi-usbcamera-fswebcam/)」

```
mksamba@raspberrypi:~ $ lsusb
Bus 001 Device 006: ID 0411:0260 BUFFALO INC. (formerly MelCo., Inc.) BUFFALO BSWHD06M USB Camera

Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

## 3.4 撮影

### 3.4.1 OpenCVのインストール
- 撮影には各種アプリが利用可能だが、今回は今後いろいろなことができそうなOpenCVを入れておく。
    - 参考：「[ラズパイにOpenCVをインストールして、画像・カメラ表示、文字・図形描画](https://monomonotech.jp/kurage/raspberrypi/opencv.html)」
- 上記の記事と同じ状況となり、新しいバージョンではインストールが失敗するため、バージョンを4.6.0.66に固定した。（バージョン指定しない場合インストール不可だった）

```
sudo apt install -y libatlas-base-dev
pip install numpy --upgrade
pip install opencv-python==4.6.0.66
```

### 3.4.2 カメラ映像のリアルタイム表示
- タイムラプス用の写真撮影の前に、アングルの調整を行うため、動画撮影（カメラ映像のリアルタイム表示）を行う。
- pythonのコードは上記の参考サイト「[ラズパイにOpenCVをインストールして、画像・カメラ表示、文字・図形描画](https://monomonotech.jp/kurage/raspberrypi/opencv.html)」のものをそのまま使用する。

``` (上記サイトからそのまま引用) cap-movie.py 
import cv2

cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    cv2.imshow('image', frame)
    key = cv2.waitKey(1)
    if key != -1:
        break
cap.release()
cv2.destroyAllWindows()
```

### 3.4.3 定期的な写真撮影

- 写真を定期的に撮影するスクリプトを作成する。
    - OpenCVで撮影する時のデフォルト解像度が640x480のため、このカメラの最大解像度(1280x720)に変更する。
    - 写真に日付/時刻を付けて、jpgフォルダに保存する。(ファイル名は7/5 00:03:45に撮影された場合、　20230705000345.jpg のようになる。)
    - sleepの間隔で写真を撮影する。
- 寝る前にスクリプトを実行しておき、起きたらCtl-Cで停止する。
- 参考：
    - 解像度：　「[【Python+OpenCV】PCカメラを使って動画を表示しよう！](https://craft-gogo.com/python-opencv-camera-display/)」
    - 日付書式：「[［解決！Python］日付や時刻をYYMMDDhhmmssなどの形式に書式化するには](https://atmarkit.itmedia.co.jp/ait/articles/2111/09/news015.html)」
    
``` cap-photo.py
import cv2
import datetime
import time

WIDTH: int = 1280
HEIGHT: int = 720

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

while True:
    ret, frame = cap.read()
    dt_now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    filename = "jpg/" + dt_now + ".jpg"
    cv2.imwrite(filename, frame)
    time.sleep(120)
```

## 3.5 複数の写真をタイムラプス動画に変換

- 後続のffmpegでの処理のため、ファイル名を連番(例：0001.jpg, 0002.jpg...)のように変更する。
    - 参考：「[フォルダ内のファイル名を一括で連番ファイル名に変更する方法【Ubuntu】](https://minoru.okinawa/archives/2995)」

```
ls | awk '{ printf "mv %s %04d.jpg\n", $0, NR }' | sh
```

- ffmpeg で写真(jpg)をつなげてタイムラプス動画(mp4)に変換する。
    - 参考：「[ラズパイで花が開花する様子をタイムラプス撮影する](https://qiita.com/ysdyt/items/25f0848c48b2d36f714b)」


```
ffmpeg -r 5 -i %04d.jpg -vcodec libx264 video.mp4
```
- 「-r 5」が、動画1秒間に何枚の写真を入れるかの設定。この記事に載せている動画の場合、2分間隔で撮影した写真を1秒に5枚入れているので、実時間の10分が動画内では1秒にまとめられていることになる。

## 3.6 動画ファイルをアニメgifに変換
- 動画(mp4)のままだとQiita記事には載せられないため、アニメgifに変換する。今回は以下のサイトを利用。
    - 参考：「[動画をGIFに変換](https://rakko.tools/tools/86/)」

# 4. 所感
- 数年間眠っていたラズパイを久しぶりに有効活用することができ、朝起きた時の楽しみもできた。
- 今回は全てラズパイで完結しているが、クラウドとの連携などの構成も試していきたい。