はじめに
RaspberryPiで作った監視カメラについて書いていきます。
LINE messaging APIを使って、LINEに通知を送れます。
※私の環境はCLIに慣れるためにGUIの無いLite版OSを使用しています。
Lite版OSをインストール
内容が多いのでこちらをまとめ用として各記事のリンクを貼っていきます。
監視カメラの機能
監視 :写真や動画を撮る
顔検知 :顔を検知する
文字列送信 :公開したURLをLINEに送る
写真送信 :写真をLINEに送る
Webサーバー:写真や動画をWebに公開する
Webhook :LINEでRaspberryPiを操作する
(写真送信、監視とWeb公開のON/OFF、プログラム終了)
I/O ボタン制御:ボタンを押すと監視とWeb公開のON/OFF、プログラム終了ができる
I/O 状態表示 :LEDで監視中と顔検知中を表示
使用したもの
※ハードウェア以外は無料で使用できる範囲での制作です。
ハード
・Raspberry Pi 4 Model B
・カメラモジュール Rev 1.3(4~5年前にAmazonで約1,500円で購入)
・ボタン、LED、抵抗、ブレッドボード、線材
・大きめの箱(DAISOで300円、子供が触らないように蓋が閉めれる)
ソフト
・C++
・OpenCV(写真や動画撮影、顔認識に使用)
・cpp-httplib(Webサーバーやクライアント機能で使用)
・OpenSSL(httplibのHTTPS通信で使用)
・thread(メインの監視機能と同時にWebサーバー機能を別スレッドで走らせるために使用)
・pigpio(ボタンやLEDを扱うために使用)
・LINE & LINEmessagingAPI
・Ngrok(ローカルのWebサーバーを公開するのに使用)
・cron(ファイルの定期的な削除に使用)
妥協したところ
今回の監視カメラ作成で妥協した点です。
動画の直接送信ができなかった
→LINE上で再生できずにずっと読み込みマークがぐるぐるしている状態でした。デバイス(iPhone)に保存して再生することはできるのですが、普通に再生できずすごくモヤモヤしました。が、割り切りました。
どのみちWeb公開しているので、代替案で動画のURLを送信することにしました。
実現までの手順
未熟なため各機能を個別に作成し、最後に少しずつ動作確認しながら組み合わせて完成させました。
そのため、記事も個別機能の作成→機能を組み合わせる、といった形で載せていきます。
私の学習方法
個別機能の作成
- AIに個別機能のコードを作成してもらう(そもそもどんな関数があるか知らないので教えてもらう+時短)
- コードを眺めて何をしているかザックリ理解(よく分からないところはAIに聞いて理解する)
- コピペせずに手打ちでコード入力(何を行なっているか理解するため+タイピング練習)
- ビルドとデバッグ(だいたいタイプミスが多いが、デバッグの練習になる)
- 少し機能をアレンジする(理解度を深める)
機能を組み合わせる
- 個別機能を組み合わせる(とりあえずこんな感じかな?くらいでコードを書いてみる)
- ビルドとデバッグ(デバッグの練習は喜んで!)
- 上手くデバッグできなければAIに頼る(知識が少ないのでAI先生に教えてもらう+そもそもやり方が間違っている場合もあるのである程度で諦める)
- AI先生に深掘りして解説してもらう(次に繋げられるよう、理解する)
1.ラズパイでカメラを使う
まずはカメラ機能を有効にして、カメラが使えることを確認します。
2.必要なライブラリなどのインストールを行う
開発環境と監視カメラで使用するライブラリなどをインストールします。
私の環境の最終的なディレクトリ構成を記載しています。
ここからのコードはcmakeの解説を省略するためファイル名を全てmain.cppで統一しております。
3.OpenCVで写真を撮る
写真を撮影するコードです。
4.OpenCVで動画を撮る
10秒間の動画を撮影するコードです。
5.OpenCVで顔を検知する
10秒間の動画撮影中に顔を検出するコードです。
6.顔検出頻度を減らして処理を軽くする
顔検知処理の負荷を減らし、撮影する動画をカクカクからぬるぬるに近づけます。
7.顔を検知したら動画を撮るように機能変更
ここだけでも簡易監視カメラとして使えますので、是非ご閲覧ください。
8.LINE Messaging APIでチャネルを作成する
LINEに通知を送るための準備です。
参考にしたYouTube動画を載せています。
9.LINEにメッセージを送る
cpp-httplibを使ってLINE API に POSTリクエストを行います。
10.Ngrokをインストールする
この次からWebサーバー機能を作っていくため、先にWebサーバーを安全に公開してくれるトンネリングサービスをインストールします。
無料で簡単に使用できるとても便利なサービスです。
11.LINEに写真を送信する
ラズパイのWebサーバーで写真を外部公開し、同時にLINE APIへPOSTリクエストして写真URLにアクセスさせます。
※LINEに動画を送信する機能は妥協した部分ですので、もし再挑戦して上手く実装できれば記事を作成します。
12.Webhook機能でLINEからのメッセージに応答する
LINEから遠隔でラズパイのモード変更を行う時に使用するWebhook機能を作成します。
13.テキストファイルからチャネルトークンなどを読み込む
チャネルトークン等のプログラム内に直接書きたくない情報をテキストファイルで管理し、ファイルから読み込めるようにします。
14.テキストファイルで読み込んだチャネルにメッセージを送る
第9弾と第13弾の組み合わせになります。
15.LEDとボタンでLチカする
状態表示用LEDとボタンでラズパイを操作する前準備です。
・各機能を組み合わせていく
※記事ができたらのせます。
・cronで古いファイルを定期的に削除する
※記事ができたらのせます。
さいごに
過去にもLINE Notifyでの監視カメラを作ったことがありますが、今回はLINE Notifyがサービス終了したのでLINEmessagingAPIを使用し大きく改良しました。
未熟なため難しい部分が沢山ありましたが、多くのことを学べました。何よりも少しずつ実現するのがとても楽しかったです。
私のような初心者でもやってみようと思えるくらい手順化して書ければと思っています。
振り返りながらなので抜け漏れが出そうですが、極力無いように努めます。
※Lite版OSで作成後、デスクトップ版OSでも動作することを確認する予定です。
AIを使って思ったこと
4年前に、LINE Notifyで監視カメラを作った時に比べて、格段に実現スピードと理解度が上がった。
当時は、監視カメラの機能を実現するための必要な情報を探すことが大変で、C++の欲しい情報を見つけられず、pythonで書かれた監視カメラのコードを理解して、それをC++でどう書くか調べるという方法でどうにか作成した。
そのため上手く情報を集めることができなかった(私が未熟なためです)が、AIでは、必要な情報をすぐに手に入れ、さらに深掘りして聞くことができるので、学びやすい環境になったと思う。
