ラベンダーの発育状況をRaspberry Piを用いて記録する

## 2020年5月17日、ラベンダーの芽がでた

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61029/d0959208-3e65-9918-7fbe-710e6ddd1ec0.jpeg" width=70%>

せっかくなのでRaspberry Piで発育の記録を撮ってみることとしました。簡単に作れたのでまとめておきます。

## 材料

- Raspberry Pi 3 Model B(未検証ですが他のモデルでも動くと思います)
- Raspberry Pi Camera Module V2
- 観測対象(今回は発芽直後のラベンダー)

## 下準備

- Raspberry Pi OS(Raspbian)をインストールしておく(参考: [Installing operating images](https://www.raspberrypi.org/documentation/installation/installing-images/README.md))
- カメラモジュールを接続しOSの設定からカメラを有効化しておく(ついでにSSH、VNCも有効化しておくとメンテナンスが楽)

## 手順

### 1. カメラのテスト

まず下記コマンドを実行し、カメラモジュールが正常に動作しているかを確認します。プレビュー画像が出た後に、カレントディレクトリにtest.jpgファイルが出力されていれば正常動作しています。

※VNCで接続している場合、初期設定だとプレビュー画像が表示されません。Raspberry Pi上のVNCの設定から、Troubleshooting->Enable direct capture modeを選択することで表示されます。

```bash

raspistill -o test.jpg
```

### 2. 撮影スクリプトの作成

下記のようなスクリプトを作成し、ホームディレクトリ(`/home/pi`)に`picam.sh`として保存します。`chmod +x picam.sh`で実行権限をつけた後、`./picam.sh`で実行すると、`/picam`に日付ディレクトリが作成され、その中に撮影画像が保存されます。ファイル名は好みで変更してください。

```bash
#!/bin/bash
DIRNAME=$(date +"%Y%m%d")   # 20200523
DATE=$(date +"%Y%m%d_%H%M") # 20200523_2230
mkdir -p /picam/$DIRNAME
raspistill -o /picam/$DIRNAME/$DATE.jpg
```

### 3. 定期実行スクリプトとして登録

`crontab -e`を実行し、末尾に下記のような15分ごとに`picam.sh`を実行する設定を追記します。撮影頻度によって値を変更してください。


```bash
*/15 * * * * /home/pi/picam.sh
```

### 4. Raspberry Piとカメラモジュールを上手い具合に配置する

この物理作業が結構時間かかります。創意工夫で良い感じにカメラを設置します。私は三脚の雲台と割り箸と調味料の缶を用いて配置しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61029/4a38d8eb-16f2-579e-01c2-e8fa4b35b188.jpeg" width=70%>

### 補足1：プレビュー画像を見ながらの配置

`raspistill -o test.jpg -t 100000000`のようなコマンドを実行することで、プレビュー画像を長時間表示できます。VNCでプレビュー画像を見ながら作業すると位置合わせが楽です。


### 補足2：カメラモジュールのピント合わせ方法

ピントはカメラモジュールのレンズ部分を回転させることで変更できます。反時計回りに回すと近くに、時計回りに回すと遠くにピントが合います。最短1cmぐらいまでピントが合って結構すごいです。

### 補足3：データの保存先

上記のスクリプトは撮影した写真をRaspberry PiのSDカードに保存していますが、実運用では自宅NASに保存しています。Raspberry Pi外のストレージに保存することで、データへのアクセスが容易となることに加え、データ紛失のリスクも軽減されるためオススメです。

### 5. 完成

これでセットアップが完了です。あとは自動的に画像の撮影・蓄積が行われます。

### 6. おまけ：タイムラプス動画作成方法

せっかく定点観測したのでタイムラプス動画を作りたい。ということで[ffmpeg](https://www.ffmpeg.org/)を使って、静止画から動画を作ってみました。なお以下の操作はWindowsマシンで行っています。

#### 6.1 ffmpegで読み込むために画像を連番形式で保存し直す

ffmpegには連番形式で画像を渡す必要があるため、保存した画像をPowerShellスクリプトで連番にします。
picamディレクトリごとPCに移動し、そのディレクトリ内で下記のスクリプトを実行することで、`C:\picamoutput`に`0000000.jpg, 0000001.jpg, ...`と連番形式の画像ファイルがコピー作成されます。コピーする際にはファイルサイズを見て1MB(1048476byte)以下の画像は切り捨てています(夜間に撮影した真っ暗な画像のためです)。

```powershell

$outdir = 'C:\picamoutput'

if (-not (Test-Path $outdir)){
    New-Item $outdir -ItemType Directory
}  

$counter=0
Get-ChildItem -Recurse -File | ForEach-Object{
    if((Get-Item $_.FullName).Length -gt 1048476){
        echo $counter
        $infile = $_.FullName
        $outfile = $outdir + '\' + $counter.ToString("0000000") + ".jpg"
        Copy-Item $infile -Destination $outfile
        $counter++
    }
}

```

#### 6.2 ffmpegで画像を連結して動画にする

ffmpegをインストールし、`C:\picamoutput`ディレクトリ内で下記コマンドを実行します。その結果`out.mp4`として30fpsの動画が生成されます。

`ffmpeg -f image2 -r 30 -i %07d.jpg -r 30 -an -vcodec libx264 -pix_fmt yuv420p out.mp4`

![out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61029/df7da351-cb0e-7c5d-4daf-47088225610e.gif)

※gif画像にしたため実際の出力動画とは少し違います


## おわりに
Raspberry Piを用いることでこのような定点観測システムを簡単に作ることができます。
何か観測したいものがある方はぜひ試してみてください！