はじめに
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の設定画面を開きます。
pi@raspberrypi:~ $ su
パスワード:
root@raspberrypi:/home/pi# raspi-config
②Interfacaing Optionを選択
次に、メニュー内の「5 Interfacing Options」を選択します。
③P1 Cameraを選択
Interfacing Optionsの画面では「P1 Camera」を選択します。
④カメラの有効化
「カメラインタフェースを有効にしますか?」と聞かれるので「はい」を選択します。
以下のように「カメラインタフェースが有効になりました」と表示されればOKです。
raspi-configのメイン画面で「Finish」を選択すると、再起動を求められるので再起動します。
カメラモジュールの動作確認
ここからは、カメラモジュールが正しく動作しているか確認していきます。
①カメラモジュールの確認
まずは、以下の「vcgencmd get_camera」コマンドを実行して「supported=1 detected=1」となっていることを確認します。
root@raspberrypi:/home/pi# vcgencmd get_camera
supported=1 detected=1
②写真を撮影してみる
次に、raspistillコマンドを実行して、写真を撮影してみます。
root@raspberrypi:/home/pi# raspistill -o test.jpg
VNCでログインして、test.jpgを開いてみてください、ちゃんと写真が撮影されていればカメラモジュールの動作確認は完了です。
カメラの映像を動画記録
ここからは「最強の防犯カメラ」作成の「はじめの1歩」として、カメラで撮影した映像を動画に記録するプログラムを作成していきます。
①必要なモジュールのインストール
動画の記録を簡単に行うために、画像処理・画像解析用ライブラリであるOpenCVをインストールします。次のコマンドを実行すると、依存パッケージも含めて98個のパッケージのインストールを求められるので、「Y」で回答し、しばらく待ちます。私の場合は、ダウンロードとインストールに15分程かかったので、コーヒーでも飲みながら待ちましょう。
root@raspberrypi:/home/pi# apt update
root@raspberrypi:/home/pi# apt install python-opencv
インストール後の私の環境は、以下の通りとなりました。ご参考まで。
root@raspberrypi:/home/pi# python --version
Python 2.7.16
root@raspberrypi:/home/pi# dpkg -l|grep python-opencv
ii python-opencv 3.2.0+dfsg-6
②動画記録プログラムの作成
いよいよ動画記録のためのプログラム「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」ループを抜けるようにしています。
③プログラムの実行
プログラムが完成したら、以下のようにプログラムを実行してみましょう。画面に動画が表示されるので、VNCでログインしたコンソールから実行してください。また、カメラへのアクセスはroot権限が必要なので、rootユーザで実行してくださいね。
root@raspberrypi:/home/pi# python Camera.py
④プログラムの実行確認
プログラムがうまく実行されると、画面にカメラの映像が表示されると共に、指定したフォルダにavi形式の動画が記録されていくはずです。
保存されたファイルはXVI形式なので、VLCなどの動画再生ソフトで再生してみてください。なお、MacOSのQuicTimePlayerでは再生できませんでした。
おわりに
今回はRaspberry Piのカメラモジュールを設定し、カメラの映像を動画ファイルに記録することをやってみました。ここまでの処理であれば、わざわざプログラムを作らなくてもmotionコマンドで簡単にできるのですが、次回以降でどんどん高度化していきたいと思います。次回は、カメラで撮影した動画をライブ配信する機能を組み込んでいきます。
連載記事
1回目:カメラの設定と動画記録
2回目:カメラ映像のライブ配信 ←次はこれ
3回目:動体検知機能とLineへの通知
4回目:顔認証機能とLineへの通知
5回目:Raspberry PiへのAlexaの搭載
6回目:顔認証後にAlexaで音声通知
コメント
上記のcamera.pyで実行すると『動画は作成』されますが、再生すると『倍速再生』になります。
VideoWriterの設定したフレームレートと、動画保存のwhile処理ループにズレが出ていると
思うのですが、考慮されているのでしょうか?
ハードはRaspberry Pi3 b+です。
ブログをお読みいただきありがとうございます。そうですね、Whileループ内の処理が遅い場合、20fps出ないですね。ただ、防犯カメラという特性上、実際の時間と同じスピードで再生したいニーズはなく、むしろ事象発生時のビデオを素早く確認するニーズの方が高いです。ただ事象発生の時刻を正しく把握する必要があるので、動画に時刻を埋め込んでいます。実際の時間と同じスピードで再生したい場合には、VideoCaptureとVideoWriterでのフレームレートを10などに落とすのが良いと思います。
Do an individual mind if I offer a couple of your current posts as long since I provide credit in addition to sources back to your current blog? My weblog is usually in the same specialized niche as yours, and our users would benefit coming from some of the details you provide here. Remember to let me know when this ok with an individual. Thank you.