🥧
SBCとUSB Webカメラを使って画像をGoogle Photosに保存するクラウド対応カメラを作る
Raspberry PiなどのLinuxが動くSingle Board Computer (SBC) と安く手に入るWebカメラを組み合わせると、Google Photosに定期的に画像を保存するクラウド対応のカメラを比較的かんたんに作ることができます。
毎分程度の撮影頻度+低解像度でもOKなのであれば、安価な監視カメラのソリューションとして悪くないのではないでしょうか?
基本的な動作原理
cron により定期的に以下の処理を行うシェルスクリプトを実施実行します。
- Webカメラから画像を一枚取得してJPEGに保存する。(例:opencv_capture_jpg.py)
- 取得した画像をGoogle Photosに送る。(例:google_photos_uploader.py)
これにより、簡易な実装で実現可能です。
ソフトウェアのセットアップ方法
opencv_capture_jpg.py
の依存ライブラリ、python3-opencv
をインストールします。
apt でパッケージがダウンロードできるので今回はそちらを利用しています。
apt install python3-opencv
google_photos_uploader.py
の依存ライブラリをインストールします。
sudo pip install google-auth-oauthlib
opencv_capture_jpg.py
と google_photos_uploader.py
を GitHub からダウンロードして、作業フォルダ(例: /home/pi/uploader
)に保存します。
Google Photosに対する Authentication を実施します。
Authentication の手順の詳細は、スクリプトの README を参照してください。
python google_photos_uploader.py
作業フォルダに以下のような内容のシェルスクリプト sched_upload.sh
を作成します。
#!/bin/bash
jpg=$(date +%Y%m%d_%H%M%S.jpg)
python opencv_capture_jpg.py $jpg > exec.log 2>&1
python google_photos_uploader.py $jpg >> exec.log 2>&1
rm $jpg
実行権限を設定してください。
chmod 755 sched_upload.sh
cron のタスクをスケジュールします。
crontab -l > cron.txt
echo "*/1 * * * * /home/pi/uploader/sched_upload.sh" >> cron.txt
crontab cron.txt
これで、画像が Google Photos に毎分アップロードされるはずです。
長所
- 仕組みが非常に単純なので、問題が発生しづらく、cron で動かしているので、何かの原因で本体に再起動がかかっても正常に再開される可能性が高い。
- 保存のためのNASを用意したりしなくてよいので取り回しが良い。
- 比較的安価に用意できる。
- アップロードのスクリプトを差し替えればいろいろな環境に対応できます(Flickrの例:flickr_uploader.py、Slackの例: slack_photo_uploader.py)
短所
- Google Photos APIは、Quota(利用回数の制限)があるのであまりたくさん写真を保存するのには向いていません。
- cron で実施した場合、最低の時間分解能は1分です。それ以上の頻度で撮像したい場合はシェルスクリプトの側でループを実装したりする必要があります。
関連記事
動作確認した環境
- SBC: Raspberry Pi 4B
- OS: Raspberry Pi OS Lite
- Webカメラ: Logitec C270n
$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux
$ python --version
Python 3.9.2
$ apt list python3-opencv
Listing... Done
python3-opencv/stable,now 4.5.1+dfsg-5 armhf [installed]
$ pip list | grep google-auth-oauthlib
google-auth-oauthlib 0.4.6
Discussion