育児×家事×IoT Raspberry Piで最強の防犯カメラを作ってみる(動画記録・配信、動体検知・Line通知、顔検知・顔認証、Alexa搭載)

はじめに

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

やりたいこと

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

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

図1.png

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

実現に向けた連載

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

準備するもの

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

1.Raspberry Pi

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

2.カメラモジュール

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

3.スピーカ

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

4.マイク

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

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

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

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

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

1.raspi-configを開く

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

pi@raspberrypi:~ $ su
パスワード:
root@raspberrypi:/home/pi# raspi-config

2.Interfacaing Optionを選択

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

3.P1 Cameraを選択

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

4.カメラの有効化

「カメラインタフェースを有効にしますか?」と聞かれるので「はい」を選択します。
図8.png
以下のように「カメラインタフェースが有効になりました」と表示されればOKです。
図9.png
raspi-configのメイン画面で「Finish」を選択すると、再起動を求められるので再起動します。

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

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

1.カメラモジュールの確認

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

root@raspberrypi:/home/pi# vcgencmd get_camera
supported=1 detected=1

2.写真を撮影してみる

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

root@raspberrypi:/home/pi# raspistill -o test.jpg

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

3.カメラの映像を動画記録

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

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

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

root@raspberrypi:/home/pi# apt update
root@raspberrypi:/home/pi# apt install python-opencv

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

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

/home/pi/camera/01_Camera.py
# -*- coding: utf-8 -*-
import picamera
import picamera.array
import cv2
import time
import datetime

###################################################
## 定数定義
###################################################
#動画の格納パス
videopath='/home/pi/camera'

class Camera:
    ###################################################
    ## カメラ処理のメインメソッド
    ###################################################
    @staticmethod
    def frames():
         # カメラ初期化
         with picamera.PiCamera() as camera:
            #カメラ画像を左右左右逆転させる
            camera.vflip = True
            camera.hflip = True

            # 解像度の設定
            camera.resolution = (640, 480)

            # カメラの画像をリアルタイムで取得するための処理
            with picamera.array.PiRGBArray(camera) as stream:
                #記録用の動画ファイルを開く(時間ごと)
                curstr=datetime.datetime.now().strftime("%Y%m%d_%H")
                fourcc = cv2.VideoWriter_fourcc(*'XVID')
                out = cv2.VideoWriter(str(videopath)+'/video_'+curstr+'.avi',fourcc, 20.0, (640,480))

                #カメラ映像が落ち着くまで待つ
                time.sleep(2) 

                while True: #カメラから画像を取得してファイルに書き込むことを繰り返す
                    # カメラから映像を取得
                    camera.capture(stream, 'bgr', use_video_port=True)

                    #現在日付を取得
                    nowstr=datetime.datetime.now().strftime("%Y%m%d_%H")

                    #次の時間になったら新たな動画ファイルを切り替え
                    if curstr != nowstr:
                        curstr=nowstr
                        out.release()
                        out = cv2.VideoWriter(str(videopath)+'/video_'+curstr+'.avi',fourcc, 20.0, (640,480))

                    #動画を記録
                    out.write(stream.array)

                    # 結果の画像を表示する
                    cv2.imshow('camera', stream.array)

                    #キーが押されたら終了
                    if cv2.waitKey(1) < 255:
                        break

                    # カメラから読み込んだ映像を破棄する
                    stream.seek(0)
                    stream.truncate()

                # 表示したウィンドウを閉じる
                out.release()
                cv.destroyAllWindows()

#単独起動用
Camera.frames()

 このプログラムでは、必要なライブラリを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」ループを抜けるようにしています。

3.プログラムの実行

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

root@raspberrypi:/home/pi# python 01_Camera.py

4.プログラムの実行確認

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

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

おわりに

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

連載記事

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

育児×IoTスマートホームの関連記事

Alexaをしゃべらせる(remote2 v3.3編)
自分のGoogleカレンダーにJWTを使って予定を追加してみる
Alexaに通知を送ってみる(Node-red編)
Node-redでスマートハウス-LG製テレビを操作してみる
Node-redでスマートハウス-Gravioで子供用プリキュアボタン
育児×IoT Gravioでミルク&オムツ交換記録をGoogleカレンダにつけてみる
育児×IoT HomeAssistantでスマートホームコントローラを作ってみる

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account