Raspberry Piで最強の防犯カメラを作ってみる(動画記録・配信、動体検知・Line通知、顔検知・顔認証、Alexa搭載)[2/6]

スマートホーム
スポンサーリンク
このエントリーをはてなブックマークに追加

やりたいこと(再掲)

最終的にやりたいことは、以下の5つの機能を持つ「最強の防犯カメラ」を作ることです。機能①〜機能③は、市販されている多くの防犯カメラでも持っている機能ですが、機能④や機能⑤の顔認証機能を持つ監視カメラはまだ多くないと思います。

 機能①.動画を24時間撮影し、カメラ本体に動画で記録する
 機能②.動画をWebブラウザや他の機器から参照できるようにライブ配信する
 機能③.動体を検知したら、静止画をLineに通知する
 機能④.家族の顔を認証したら、静止画をLineに通知する
 機能⑤.家族の顔を認証したら、◯◯さんおかえり!と喋る

家に帰ると、顔を見て「○○さん、おかえり!」と言ってくれる辺りが、スマートハウスに一歩づ近づいている気がします。

実現に向けた連載

最強の「防犯カメラ」を作成するために、以下のように少しずつに記事を書いていきます(予定)。
 1回目:カメラの設定と動画記録
 2回目:カメラ映像のライブ配信 ←この記事
 3回目:動体検知機能とLineへの通知
 4回目:顔認証機能とLineへの通知
 5回目:Raspberry PiへのAlexaの搭載
 6回目:顔認証後にAlexaで音声通知

2回目:カメラ映像のライブ配信

前回はRaspberry Piのカメラの設定を行って、カメラ映像を動画ファイルに記録することをやってみました。今回は、python用のWebサーバソフトのFlaskを用いて、カメラ映像をライブ配信してPCやスマホのブラウザから見えるようにしたいと思います。

ライブ配信プログラムの作成

防犯カメラの映像をライブ配信するために、以下の4つのファイルを作っていきます。

①base_camera.pyのダウンロード

カメラ映像を簡単にライブ配信するために、先人の知恵を活用させていただきます。今回はmiguelgrinbergさんが公開しているflask-video-streamingの「base_camera.py」のモジュールを活用させていただきます。以下のように、wgetコマンドで「base_camera.py」をダウンロードしましょう。

②base_camera.pyの変更

オリジナルのbase_camera.pyは、クライアントからのリクエストに応じてスレッドを生成し、クライアントとの接続が無くなるとスレッドを停止するようにできています。しかし、このまま利用してしまうと、クライアントからのリクエストが無い時に動画ファイルへの記録が停止してしまうので、Flaskの起動時にスレッドを起動し、Flaskの終了時にスレッドを停止するように、次の2箇所を書き換えます。

1箇所目:66行目と67行目の間に「BaseCamera.thread.daemon = True」を追加

2箇所目:98行目辺りの「if time.time()・・・・」から4行をコメントアウトする。

1箇所目「BaseCamera.thread.daemon = True」によって、親スレッドが終了した場合に子スレッドも終了するようになります。また、2箇所目の変更によって、クライアントの接続がなくなってもスレッドが生き続けるようになります。

③Camera.pyの変更

次に、前回作成した「Camera.py」を以下のように変更します。変更点は次の5箇所です。

1箇所目:BaseCameraをインポートするように「from base_camera import BaseCamera」を追加
2箇所目:CameraクラスはBaseCameraを継承するようにカッコ内に「BaseCamera」を追加
3箇所目:クライアントに画像を返すように「yield cv2.imencode(‘.jpg’, stream.array)[1].tobytes() 」を追加
4箇所目:動画の画面表示は不要となるのでコメントアウト
5箇所目:Camera.pyの単独起動も不要なのでコメントアウト

この変更点の特筆すべきところは、先ほどダウンロードしたBaseCameraクラスを継承する点と、ライブ配信用に画像を返す部分です。特に、画像を返す部分では「cv2.imencode()」を使って画像をJPEG形式に変換して渡しています。

④cameraServer.pyの作成

次に、Flaskから呼ばれるメインアプリケーション「cameraServer.py」を以下のように作成します。

このプログラムでは、まずFlaskオブジェクトを作成した上で、「@app.route(‘/’)」からの3行で「/」にアクセスした時に「index.html」を返すようにし、「@app.route(‘/video’)」からの4行で「/Video」にアクセスした時に、カメラから取得した画像を返すようにしています。次の「def gen(camera)」関数の部分は、カメラからの画像データをWhileループで継続的に取得し、Context-Typeを設定してvideo()に返却しています。

プログラムの最後の部分は、自身がメインスレッドの場合(つまりflask runで実行されない場合)に、スレッドを有効にして、上記の「video()」呼び出しカメラから動画を取得するスレッドを開始します。その後「app.run()」を実行してflaskを起動しています。app.runの2つ目の引数は、flaskを立ち上げるポート番号ですので、既に80番ポートをNginxやApacheなどで利用している場合は書き換えてください。

⑤index.htmlの作成

次に「templates」フォルダを作成して、index.htmlを作成します。
※index.htmlは必ず「templates」フォルダを作成して配置する必要があります。

index.htmlの特筆すべきところは、imgタグの中で「/video」を呼び出しているところぐらいかと思います。

以上で、カメラ映像をライブ配信するプログラムの作成は完了です。

ライブ配信のテスト

それでは、作成したプログラムを実行して、ちゃんと映像が配信されるかテストしてみましょう。

①プログラムの実行

プログラムの起動は、rootユーザで以下のコマンドを実行します。今回は、画面に表示しないのでVNCでログインしたコンソールで実行する必要はありませんよ。

プログラムが正常に起動すると、以下のようにカメラスレッドが立ち上がり、続いてFlaskが起動します。

終了させる時は、画面にも表示されていますが「CTRL+C」キーを押します。

②ブラウザから確認

それでは、PCのブラウザを立ち上げ「http://<Raspberry PiのIPアドレス>/」にアクセスしてみましょう。
以下のように、防犯カメラの映像がライブ配信されると思います!!私の環境では、0.2秒程度の遅延はあるものの、ほぼリアルタイムでカメラの映像が見えています。

Raspberry Pi起動時に自動起動する

最後に、Raspberry Piの起動後にSSHでログインしてプログラムを手動で実行するのは面倒なので、systemdにサービス登録して、Raspberry Piの起動時に自動的に監視カメラのプログラムが実行されるようにします。

①cameraServer.shの作成

systemdに登録するシェルスクリプト「cameraServer.sh」を以下のように作成します。

Systemdからの起動の場合環境変数が読み込まれないので、環境変数をいろいろ記述(不要なのもあるかもしれません)して、先ほど作成した「cameraServer.py」をフルパスで記述して実行できるようにします。

②cameraServer.shの確認

シェルスクリプトを作成したら、実行権限を付与して、ちゃんと起動できるか確認してみます

③flask.serviceの確認

上で作成したシェルスクリプトを呼び出すSystemd用のファイルを「/etc/systemd/system/flask.service」に作成します。

④サービスの起動確認

それでは、Systemctlコマンドを用いて、以下のようにサービスを起動してみてください。サービスがちゃんと起動したかは、Systemctlコマンドに「status」オプションを付けると確認できます。

ちなみに、サービスを停止させるときは「systemctl stop flask.service」で停止できます。

⑤サービスの自動起動設定

最後に、Raspberry Pi起動時に自動的にサービスを起動させるために、Systemctlコマンドに「enable」オプションをつけて実行します。

⑥再起動して確認

それでは、Raspberry Piを再起動して、防犯カメラのサービスが自動的に起動するか確認してみてください。また、ブラウザからアクセスして映像が見えるかも確認してくださいね。

おわりに

今回はカメラで撮影した動画をライブ配信することをやってみました。次回は、防犯カメラに動体検知機能を追加し、動体を検知したらLineに通知がくるようにしてみたいと思います。

連載記事

 1回目:カメラの設定と動画記録
 2回目:カメラ映像のライブ配信
 3回目:動体検知機能とLineへの通知 ←次はこれ
 4回目:顔認証機能とLineへの通知
 5回目:Raspberry PiへのAlexaの搭載
 6回目:顔認証後にAlexaで音声通知

関連記事

Alexaをしゃべらせる(Node-red編)
やりたいことNode-redでnode-red-contrib-amazon-echoやnode-red-contrib-alexa-home-skillのパレットを使うと、Alexaに音声で話しかけることをトリガーにNode-redの処理
自分のGoogleカレンダーにJWTを使って予定を追加してみる
今回は、JWT(JSON Web Token)を使って、ブラウザからのログイン操作なしで特定のGoogleカレンダーに予定を追加することをやってみます。
Alexaに通知を送る(Node-red編)
今回は、Alexaに「通知」を送ることをやってみたいと思います。ちなみに、この通知を送る機能は「プロアクティブイベントAPI」という物を利用しますが、少々実装が面倒なのが難点です。
Node-redでスマートハウス-LG製テレビを操作してみる(1/5)
はじめに我が家にも有機ELテレビがやってきました。国産メーカのテレビも、有機ELパネルはほとんどがLG製のパネルを利用しているらしく「同じパネルなら安い方がいいんじゃない?」という事でOLED 55C7Pを購入!このLG製のテレビ、内部はw
Node-redでスマートハウス-Gravioで子供用プリキュアボタン
今回は、Gravioのボタンセンサーを使って、2歳の子供でもテレビのアプリをyoutubeにして、プリキュアの動画を再生できる「プリキュアボタン」を作りたいと思います。
Gravioでミルク&オムツ交換記録をGoogleカレンダにつけてみる
子育てをしていると両手が塞がっていたり、手が汚かったりすることが本当多いんです。なので、スマホを手に取って、ロック解除して、記録アプリを開いて、時間・種類などをいちいち入力することはホント面倒です。今回は「赤ちゃんボタン」を作って、ボタンを押すだけでミルク&おむつ交換の記録がワンプッシュで記録することをやってみます。
Node-redだけで簡易Alexaアプリを作ってみる「アレクサ、雨雲きてる?」
今回はASKを使わずNode-redだけを使って、自分用の簡易Alexaアプリを作ることをやってみたいと思います。
HomeAssistantでスマートホームコントローラを作ってみる[1/6]
家の中にIoT機器が増えてくると、スマホのリモコンアプリやHEMSのパネルなど、情報や操作がバラバラになってきます。そこで、今回はHome Assistantを使って家の中のIoT機器を一元管理できるようにしてみたいと思います。
記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。
ブログランキング・にほんブログ村へ
スポンサーリンク
naka-kazz

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム 開発者向け
naka-kazzをフォローする
育児×家事×IoT

コメント

タイトルとURLをコピーしました