ATOM Cam 2 で撮影した画像をSORACOM Harvest Filesに送信して SORACOM Lagoon で可視化する

## はじめに

先日、[SORACOM Cloud Camera Service（ソラカメ）](https://blog.soracom.com/ja-jp/2022/05/18/new-launch-soracam-as-an-eye-of-internet/)が発表されました。
対応デバイスとして販売されている ATOM Cam 2 は Wi-Fi モデルであり、基本的には iOS/Android アプリから利用するものですが、カメラ自体は RTSP プロトコルに対応しているためカメラの映像を対応するプレーヤーをインストールした PC などから確認することもできます。

この記事では、ローカル環境に設置した Raspberry Pi から ffmpeg コマンドを利用して ATOM Cam 2 の撮影データを画像として取得し、SORACOM プラットフォームに接続可能なデバイスを通して画像データを SORACOM Harvest Files にアップロードして SORACOM Lagoon ダッシュボードで可視化する手順を紹介します。

## 必要なもの
- ATOM Cam 2
    - ソラコムがソラカメ対応デバイスとして販売している ATOM Cam 2 はもちろん、アトムテック社が販売する ATOM Cam 2 でも実現できます。
    - 原理的には RTSP プロトコルで映像を取得できるネットワークカメラであればこの記事で紹介する方法を応用できます。
- ATOM アプリ
- ATOM Cam 2 と同一ネットワーク内で ffmpeg コマンドを実行できる環境
    - ここでは Raspberry Pi を使用します。
- SORACOM プラットフォームに接続するための機材一式
    - [SORACOM Air for セルラー](https://users.soracom.io/ja-jp/docs/air/) の SIM カード（SORACOM IoT SIM および特定地域向け IoT SIM）と USB ドングルなど
    - もちろん、[SORACOM Arc](https://users.soracom.io/ja-jp/docs/arc/) を利用することで SIM や USB ドングルなどを購入せずにお試しいただくこともできます。

## 手順

### ATOM Cam 2　の「PCで再生」を有効にする

ATOM アプリから設定を有効化したいカメラを選択し、歯車アイコン→[その他]→[PCで再生]をタップし、「オンにする」ボタンをタップします。

![Screenshot_20220519-154559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/2b38d600-9048-3a20-6d9f-1685e1ecadf8.png)

表示される `rtsp://` から始まる URL が ATOM Cam 2 から送信される映像の URL になります。

![Screenshot_20220519-144839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/4c6845e9-b7a1-7407-5270-c373ba11c535.png)

### ffmpeg で静止画としてデータを取得する

RTSP で配信されるものは動画ですが、ここでは ffmpeg コマンドを実行した時点のデータを静止画として JPEG 形式で取得します。`rtsp://` から始まる部分は ATOM アプリで表示された URL を指定します。

```
# ffmpeg -y -i rtsp://AAAA:BBBB@192.168.XXX.YYY/live -frames:v 1 -s 1280x720 -loglevel warning image.jpg
```

以下のような画像が取得できます。解像度や引数などは取得したい画像に応じて適宜変更してください。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/3f440b40-a70f-54fb-507b-dd37d5a6c780.jpeg)


### SORACOM Harvest Files に送信

事前に [SORACOM Harvest Files および SORACOM Harvest Data への連携を有効化](https://users.soracom.io/ja-jp/docs/harvest/enable-files)しておきます。
撮影した画像を以下のコマンドで SORACOM Harvest Files に送信します。保存先のパスは任意のものに変更してください。

```
# curl -X PUT --data-binary @image.jpg -H "Content-type: image/jpeg" http://harvest-files.soracom.io/path/to/image.jpg
```

**参考リンク**
[デバイスのファイルを Harvest Files に送信する](https://users.soracom.io/ja-jp/docs/harvest/send-files/)

### SORACOM Lagoon で画像を表示

SORACOM Lagoon の Soracom Dynamic Image Panel を利用することで SORACOM Harvest 上にある画像ファイルをダッシュボードに表示できます。

**参考リンク**
[Harvest Files の画像を SORACOM Lagoon で表示する](https://users.soracom.io/ja-jp/docs/harvest/lagoon/)
[SORACOM Lagoon で単一デバイスから送信された複数の画像を可視化する](https://blog.soracom.com/ja-jp/2022/04/08/how-to-display-multiple-images-in-soracom-lagoon/)

### できあがり

一連の流れのシェルスクリプトは以下のとおりです。

```sh
#!/bin/bash

DATE="$(date +%s)"

echo "Shoot image via RTMP from ATOM Cam 2..."
ffmpeg -y -i rtsp://AAAA:BBBB@192.168.XXX.YYY/live -frames:v 1 -s 1280x720 -loglevel warning image.jpg

echo "Sending images..."
curl -X PUT --data-binary @image.jpg -H "Content-type: image/jpeg" http://harvest-files.soracom.io/path/to/image-${DATE}.jpg

echo "Done."
exit 0
```

実行結果は以下のとおりです。左側が Raspberry Pi 上のソースコードとシェルスクリプトを実行している VSCode、右側が SORACOM Lagoon の ダッシュボードです（表示に時間を要しているように見えるのは、ダッシュボードの更新間隔によるものです）。
![画面収録 2022-05-19 16.06.15.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/7e493b44-fc0b-5da2-39fb-ff60f9ed809e.gif)

## おわりに
ATOM Cam 2 は Wi-Fi 対応の安価なネットワークカメラで、電源と Wi-Fi があればどこにでも設置できる点はとても大きなメリットです。
この記事の方法を応用することで複数台のデバイスから画像を取得したり、なんらかの加工や独自の検出処理を行うこともできると思いますので、参考になれば幸いです。