OpenCV Python RaspberryPi

Raspberrypi+Python監視カメラ製作まとめ

投稿日:

Raspberrypiを用いた監視カメラを実用検討し、一旦の完成を迎えたのでまとめます。

<やりたいこと>

(1) 日中常時監視

(2) 全録画だと容量不足となるため動体検知した時のみの動画を残す

(3) 動体検知のイベントはLINEですぐに通知する

(4) 残した動画は定期的にまとめてGoogleDriveにアップロードする

<フォルダ構成>

各ファイル置き場を以下としました。

/home/pi

・GoogleDriveUpload.py

・client_secrets.json

・settings.yaml

/home/pi/Pi_video

・raspivid_always.py

・motion_detect_LINE_notify.py

<実施手段>

(1) 日中常時監視

60秒で1つの動画ファイル(H264形式)を撮影・保存し続けるPythonスクリプトです。

室内から外を監視する事と照明が設置できていないことから日中限定の常時監視に留まっています。

5行目:録画時間を60秒とします

7行目:動体検知を別スクリプトで実施する際に参照するためのファイル名のリストを作成します。

21行目:日中限定ということで午前6時〜午後6時までの撮影に限定しました。

(2) 全録画だと容量不足となるため動体検知した時のみの動画を残す
(3) 動体検知のイベントはLINEですぐに通知する

ファイルリストから(1)で保存されたH264形式の動画を読み込み、動体検知を行います。動体検知がある一定以上の大きさだったら静止画をLINE通知します。動体検知が一定以下の場合は動画を削除します。

結果、(1)で撮り続けた動画の内、動体検知したものだけ残るということになります。

14行目:LINE通知するためのトークンです。設定は以下の記事をご参照ください。

Paspberrypiでwebカメラの動体検知結果をLINE通知する

18行目:(1)で作成したファイルリストから動画ファイル名を取得します。

28行目:動画データを読み込みます。

30〜43行目は動画が読み込めなかった時、つまりはファイルリストに記載されているファイル名の動画が存在しなかった時はファイル名を削除します。

45〜65行目:OpenCVを用いた動体検知処理を行います。動画データは30fps、60秒のため計1800枚の静止画から成っていますがそのままだと処理時間が長くなるため、54行目で30枚間引きしています。そのため計60枚の静止画から動体検知を行なっています。momentという名前のListに動体検知値を格納しています。

67〜71行目:momentの中から5番目の値を動体検知値と定義しています。

5番目としたのでは0,1番目だと目視した動画で何もないように見えた時も動体検知値が大きく出る場合があったのでそこから少し余裕を見て設定しています。

73〜88行目:動体検知値から一定値を超えたらLINE通知しています。

一方、一定値以下だった場合は動画を削除します。

91〜102行目:ファイルリストから動画名を削除し、次の動画処理に移れるようにします。

104〜106行目:例外処理

(4) 残した動画は定期的にまとめてGoogleDriveにアップロードする
・GoogleDriveアップロード

上記までの処理でラズパイ上に動体検知した動画が残ります。都度アクセスして取りにいくのは煩わしいため、定期的にGoogleDriveにアップロードします。

今回は毎日定刻にアップロードする仕組みを構築します。

今回はまずGoogleDriveにアップロードするだけのPythonスクリプトを作成し、cronという定期処理する機能を用いてやりたいことを実現しました。

※自分の環境起因の気がしますが、(1)(2)(3)のスクリプトは/home/pi/Pi_videoというフォルダで実行しており、下記のGoogleDriveアップロードのスクリプトも同上で実施できず(pydriveがimportされてないとエラー表示)、止む無く/home/piで実行しました。

GoogleDriveにアップロードするPythonスクリプト

OAuth認証等の事前準備は以下記事をご参照ください。

RaspberryPi+Pythonで取得した動画をGoogleDriveに自動でアップロードする

10行目:folder_idに保存先のGoogleDriveを指定します。

仮で'ZZZZYYYYXXXXX88887777333311110000'とします。

14〜15行目:年月日をstrtimeという変数に入れます。動画ファイル名に付与した年月日からアップロードする動画を選別します。

18行目:globという条件を満たすパス名一覧を取得してくれる便利な機能を使って、当日の年月日が含まれたパス名一覧をlistに格納します。

22〜31行目:for文を用いてlistの要素数分のGoogleドライブへのアップロードを行います。

・cronによる定期処理

cronを設定する定期処理したい内容を書き込めばOKです。

ラズパイのターミナルで処理します。

最初にエディタを選択して$crontab -l でcronを設定するファイルを開きます。

設定箇所は39行目の

$05 21 * * * /usr/local/bin/python3 /home/pi/GoogleDriveUpload.py

だけです。

21時05分に/usr/local/bin/python3を使って、/home/pi/GoogleDriveUpload.pyというファイルを実行します。

12行目:$which python3 でpython3のフルパスを取得

39行目:定期処理したい内容

41行目:sudo /etc/init.d/cron startでcronが動作開始

47行目:active(runnig)となっており動作が確認できます。

90行目:指定した21:05にpython3が動作しています。

結果

赤枠がGoogleDriveの固有のfolder_idです。これで出先からも監視カメラの動画を確認することが出来るようになりました。

以上。

-OpenCV, Python, RaspberryPi

Copyright© IT系でないエンジニアの転身 , 2020 All Rights Reserved Powered by STINGER.