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

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

はじめに

6ヶ月間の育児休業を取って、育児&家事に専念しているnaka-kazzです。我が家では、防犯のために玄関に防犯カメラを置いています。しかし、この防犯カメラ、スマホアプリを通じて動画を見たり動体検知をすることはできるのですが、独自のプロトコルを使っていて、他の機器との連携がいまいちです。そこで今回は、Raspberry Piを使って、最強の防犯カメラを自作してみます。

やりたいこと

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

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

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

実現に向けた連載

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

準備するもの

上記の最強の防犯カメラ(動画記録・配信、動体検知・Line通知、顔検知・顔認証、Alexa搭載)を作るために、今回は以下のものを準備しました。

①Raspberry Pi

まずは、今回の監視カメラのキーとなるRaspberry Piです。昨年の10月頃からPi 4も国内で入手可能になったようですが、今回は手元にあった3B+を利用します。動画保存+動体検知+顔認証+Alexaの高負荷に耐えれるか若干の不安はありますが・・・。

②カメラモジュール

監視カメラを作るのに欠かせないカメラモジュールです。今回は、Raspberry Pi純正のPi Camera Rev 1.3を利用します。

③スピーカ

顔認証の後に「○○さんおかえり」と喋るためのスピーカです。今回は「300円の割りに音質が良い」と評判のダイソーの300円スピーカを利用します。電源をUSBから取れるのもポイントです。

④マイク

監視カメラとしては不要ですが、Alexaを搭載するので、家のスマートホームシステムに音声でアクセスするためにマイクを用意しました。今回は、集音性が高い(?)との噂の「PLOY pc USBマイク」を利用します。なお、このマイクはRaspberry Piをサポートしていない旨がAmazonのサイトにも書かれているのですが、搭載しているチップは「iTalk-02」というものであり、Raspberry Piでの動作が確認されています。

1回目:カメラの設定と動画記録

事前準備として、Raspberry Piに「Raspbian Buster with desktop」をインストールして、sshとVNCでログインできるようにしておきましょう。ちなみに、私は「September 2019」を使用しました。また、rootのパスワードを設定しておくと便利です。

カメラモジュールの有効化

Raspberry Piでカメラを利用するためには、カメラモジュールを有効化する必要があるので、まずはその設定を行います。

①raspi-configを開く

まずRaspberry PiにSSHでログインして、rootになります。次に、raspi-configコマンドを実行してRaspberry Piの設定画面を開きます。

②Interfacaing Optionを選択

次に、メニュー内の「5 Interfacing Options」を選択します。

③P1 Cameraを選択

Interfacing Optionsの画面では「P1 Camera」を選択します。

④カメラの有効化

「カメラインタフェースを有効にしますか?」と聞かれるので「はい」を選択します。

以下のように「カメラインタフェースが有効になりました」と表示されればOKです。

raspi-configのメイン画面で「Finish」を選択すると、再起動を求められるので再起動します。

カメラモジュールの動作確認

ここからは、カメラモジュールが正しく動作しているか確認していきます。

①カメラモジュールの確認

まずは、以下の「vcgencmd get_camera」コマンドを実行して「supported=1 detected=1」となっていることを確認します。

②写真を撮影してみる

次に、raspistillコマンドを実行して、写真を撮影してみます。

VNCでログインして、test.jpgを開いてみてください、ちゃんと写真が撮影されていればカメラモジュールの動作確認は完了です。

カメラの映像を動画記録

ここからは「最強の防犯カメラ」作成の「はじめの1歩」として、カメラで撮影した映像を動画に記録するプログラムを作成していきます。

①必要なモジュールのインストール

動画の記録を簡単に行うために、画像処理・画像解析用ライブラリであるOpenCVをインストールします。次のコマンドを実行すると、依存パッケージも含めて98個のパッケージのインストールを求められるので、「Y」で回答し、しばらく待ちます。私の場合は、ダウンロードとインストールに15分程かかったので、コーヒーでも飲みながら待ちましょう。

インストール後の私の環境は、以下の通りとなりました。ご参考まで。

②動画記録プログラムの作成

いよいよ動画記録のためのプログラム「Camera.py」を以下のように作成します。

このプログラムでは、必要なライブラリをimportした後に、定数定義部分で動画を格納するパスを設定します。次に、Cameraクラスを定義して、static関数としてframes関数を定義します。クラス定義はこの段階ではしなくても良いと思いますが、第2回目以降のためにクラスにしておきます。
 frames関数の中では、PiCameraのオブジェクトを取得し、画像の上下左右の逆転や解像度の設定を行います。上下左右の逆転は、カメラの向きによっては不要なので適宜変更してください。次に、動画のファイル名に利用する現在日時を「”%Y%m%d_%H”」の形式で取得し、OpenCVのVideoWriter_fourcc関数で動画のエンコード形式を指定します。今回は「XVID」を指定しています。そして、VideoWriter関数に、ファイル名、fourcc、フレームレート、解像度を与えて、動画出力用のオブジェクトを取得します。
 その後の「While True」の部分がメインの処理になります。まず、カメラから1枚づつフレーム画像を取得し、それを「out.write()」で動画ファイルに書きこんでいます。ただし、動画の保存中に時間が変化(1時→2時)した場合には、ファイル名を切り替えたいのでそのための処理を間に入れています。
 「cv2.imshow()」で画面に動画を表示させ、「cv2.waitKey()」でキーボードから何かキーが押されたら「While True」ループを抜けるようにしています。

③プログラムの実行

プログラムが完成したら、以下のようにプログラムを実行してみましょう。画面に動画が表示されるので、VNCでログインしたコンソールから実行してください。また、カメラへのアクセスはroot権限が必要なので、rootユーザで実行してくださいね。

④プログラムの実行確認

プログラムがうまく実行されると、画面にカメラの映像が表示されると共に、指定したフォルダにavi形式の動画が記録されていくはずです。

保存されたファイルはXVI形式なので、VLCなどの動画再生ソフトで再生してみてください。なお、MacOSのQuicTimePlayerでは再生できませんでした。

おわりに

今回はRaspberry Piのカメラモジュールを設定し、カメラの映像を動画ファイルに記録することをやってみました。ここまでの処理であれば、わざわざプログラムを作らなくてもmotionコマンドで簡単にできるのですが、次回以降でどんどん高度化していきたいと思います。次回は、カメラで撮影した動画をライブ配信する機能を組み込んでいきます。

連載記事

 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アプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

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

コメント

  1. water より:

    上記のcamera.pyで実行すると『動画は作成』されますが、再生すると『倍速再生』になります。
    VideoWriterの設定したフレームレートと、動画保存のwhile処理ループにズレが出ていると
    思うのですが、考慮されているのでしょうか?

    ハードはRaspberry Pi3 b+です。

    • naka-kazz naka-kazz より:

      ブログをお読みいただきありがとうございます。そうですね、Whileループ内の処理が遅い場合、20fps出ないですね。ただ、防犯カメラという特性上、実際の時間と同じスピードで再生したいニーズはなく、むしろ事象発生時のビデオを素早く確認するニーズの方が高いです。ただ事象発生の時刻を正しく把握する必要があるので、動画に時刻を埋め込んでいます。実際の時間と同じスピードで再生したい場合には、VideoCaptureとVideoWriterでのフレームレートを10などに落とすのが良いと思います。

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