ネットワークカメラとGoogle Driveの連携
前回の続き、ネットワークカメラの撮影結果をGoogle Driveに定期保存する方法を解説します。
今回はネットワークカメラに関する記事の続きです。
前回説明した全体図のうち、今回ご説明する部分を赤枠で囲みました。
④ cronで毎日0,6,12,18時に画像撮影
⑤ PyDriveで画像をクラウドへ保存
pythonのプログラムでRaspBerry PiからC200に撮影リクエストを行い、 取得した画像を保存する事が出来ていました。 今回はその取得した画像を単にRaspBerry Piに保存するのではなく、 Google Drive上のフォルダに送信するコードを追加します。
Google Driveについて
Googleのサービスは日本でも広く使われているため、 説明するまでもなくご存じの方もいらっしゃるかと思います。 同サービスはクラウドストレージとしては古くから存在し、 常にサービスのブラッシュアップがなされてきました。 クラウドストレージと呼ばれるサービスは数あれど、 Google ドライブはコスト、機能ともに優れており、 お勧めなサービスの一つです。
個人的には、ブラウザ上のファイルビューアがとても優秀です。 画像データはもちろん、HDビデオを再生する事も可能で、 クラウド上のデータを確認する際に一々余計なダウンロードを挟まなくとも済みます。 また、1つのGoogleアカウントに15GBまでの無料利用枠が有、 今回のように画像データを保存し続ける用途ではまず不足することはありません。 (Google フォトなどと連携されている方は、写真やビデオで圧迫されることもあるかと思いますが、これ専用のアカウントを作成すれば問題ない話だと思います。)
Google Driveに保存フォルダを作成
下記リンクからGoogle Driveにアクセスしましょう。
右上の「ドライブに移動」で個人のアカウントのGoogle Driveに移動できます。
適当なフォルダを作成しましょう。(私はc200という名前にしました。)作成したフォルダにクリックして入ると、 URLの「https://drive.google.com/drive/u/0/folders/」以下に赤枠のような長い文字列が現れるはずです。(画像では15…で始まる所) これがフォルダIDであり、後程Pythonスクリプトで必要な情報となります。この文字列をメモしておいてください。
Python側の準備
PyDriveにPythonからアクセスするためのライブラリ群をインストールしましょう。 今回は以下の二つが必要です。
クライアントAPI
pip install google-api-python-client
PyDrive
pip install PyDrive
OAuthの準備
PyDriveにセキュアにアクセスするために、Google Cloud Platform上でOAuthの設定を行います。 手順を解説している方がいましたので、紹介します。
PythonでGoogle Driveにファイルをアップロードする | Men of Letters(メン・オブ・レターズ) – 論理的思考/業務改善/プログラミング
以下の二点を行います。 * Google API コンソール(Google Developers Console)のGoogle Drive APIを有効にする。 * OAuth 2.0 クライアント IDを作成する。
上記はコンソール上で実行することが可能です。 一通り終わりましたら、 アクセスするために必要な「client_secrets.json」「credentials.json」「settings.yaml」の3ファイルを入手してください。 これをRaspberry Piのホームディレクトリに保存します。
注意:後程設定するcronはホームディレクトリで実行されるため、 上記の3ファイルもホームディレクトリに保存する必要があります。 ここははまるポイントなので、ご注意ください。
Pythonコード
先日紹介したコードを応用して、画像を取得してからGoogle Driveに送信するまでの一連を一つのスクリプトにしました。 一時的に画像をRaspberry Piフォルダに保存し、題名を日付タイムスタンプにして保存します。
import cv2 import os from datetime import datetime as dt from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive drive_root_dir="./gdrive/My Drive" drive_folder_id = 'hogehuga' #メモした保存先のフォルダID user_id = "amesyabody" user_pw = "hogehuga" host = "xxx.xxx.xxx.xxx" port = "554" stream = "stream2" cap = cv2.VideoCapture(f"rtsp://{user_id}:{user_pw}@{host}:{port}/{stream}") ret, frame = cap.read() # 日付読み込み tdatetime = dt.now() tstr = tdatetime.strftime('%Y-%m-%d-%H-%M-%S') #print(tstr+".jpg") # 静止画中間ファイル保存 cv2.imwrite("tmp.jpg", frame) #Google Driveへ保存 gauth = GoogleAuth() gauth.LocalWebserverAuth() drive = GoogleDrive(gauth) f = drive.CreateFile({'title': tstr+".jpg",'parents' : [{'id' : drive_folder_id}], 'mimeType': 'image/jpeg'}) f.SetContentFile("tmp.jpg") f.Upload() os.remove(r"tmp.jpg") cap.release() cv2.destroyAllWindows()
cronでなく単純に実行する際には、Pythonスクリプトと同じフォルダに「client_secrets.json」「credentials.json」「settings.yaml」の3ファイルを 保存して参照できるようにする必要があります。cronではホームディレクトリに保存することに注意です(大事なことなので2回目言いました)。
cron
Pythonスクリプトを実行し、無事日付のついた画像ファイルがc200フォルダに保存されたら、最後にcronで自動的に実行するようにします。 crontabを編集しましょう。
crontab -e
個人的な趣向ですが、crontabの編集はnanoコマンドがやりやすいです。人によると思いますが…。 毎日0時、6時、12時、18時に定期実行する場合は、下記を追記しましょう。
0 0,6,12,18 * * * /usr/bin/python3 /home/pi/Desktop/cap_c200.py
さいごに
以上で定期的にネットワークカメラから画像を取得して、Google Driveに保存する仕組みが完成しました。 実は、野菜の成長を見守るために始めたのですが、ゆずの木を手に入れたので、 現在はゆずの木の見守りに使っていたりします。 ただ、ゆずの木は成長が年単位なので、一日に4枚写真を撮ってもあまり変わり映えしないかも…。 ちょっとまだ使い方は他にもあるかなと思っていて、考えてます。 それはそれとして、今回はネットワークカメラの仕組み、データのやり取り、Google Drive等非常に勉強になりました。 3回に分けて、大分ボリュームのある記事になってしまいましたが、その価値はあったかなと思います。
一方で、水耕栽培の研究らしき記事が最近ちょっとない! ぼちぼちサニーレタス、べんり菜、ルッコラ、クレソンの収穫が始まっているので、 それらの記事も書いていければ、と思います。
ではまた!