- バスターとOpenCVを使用したRaspberryPiのセットアップ
- Raspberry Pi5Inchディスプレイにブザーを追加
- CCTVモーション検出用のRaspberryPiのプログラミング
- RaspberryPiを使用したOpenCVでのモーション検出
- モーション検知用アラーム設定
- CPUの温度と使用状況の監視
- PiCCTVモーションディテクターの起動
OpenCVは強力なツールであり、Raspberry Piと組み合わせると、多くのポータブルスマートデバイスへの扉を開くことができます。以前のRaspberryPi CCTVモニタリングの記事では、RTSPを使用してDVRからライブCCTVビデオを取得し、Raspberry Piに表示する方法を学びました。先に進む前に、それを確認してください。この記事では、OpenCVのパワーを活用し、ライブCCTV映像でRaspberryPiモーション検出システムを構築する方法を学習します。 CCTVがインストールされていない場合でも、USBカメラをPiに直接接続することで、Raspberry PiSurveillanceシステムを構築できます。また、PiとPythonの大ファンでない場合は、ESP32と同様のものを作成できます。詳細については、ESP32Wi-Fiドアベルを参照してください。
4台のCCTVカメラすべてを同時に監視してアクティビティ(モーション)を確認できるPythonスクリプトを作成します。いずれかのカメラでアクティビティが検出されると、Raspberry Piは自動的にその特定のカメラ画面に切り替わり、発生したアクティビティを強調表示します。これらはすべて、わずか1.5秒の遅延でリアルタイムに行われます。また、アクティビティが検出された場合にビープ音を鳴らしてユーザーに警告できるブザーなどのアラーム機能も追加しました。しかし、これを簡単にスケールアップして、メッセージや電子メールなどを送信することができます。エキサイティングな権利!始めましょう
バスターとOpenCVを使用したRaspberryPiのセットアップ
BusterOSを実行しているRaspberryPi 3 B +を使用していますが、OpenCVのバージョンは4.1です。まったく新しい場合は、開始する前に以下のチュートリアルに従ってください。
目標は、Piを稼働させて開発の準備を整えることです。Piに任意のバージョンのRaspbianOSをインストールしても問題ありませんが、OpenCVのバージョンが4.1以降であることを確認してください。上記のチュートリアルに従ってOpenCVをコンパイルすることができます。これには数時間かかりますが、重いプロジェクトでは信頼性が高くなります。または、次のコマンドを使用してpipから直接インストールすることもできます。
$ pip install opencv-contrib-python == 4.1.0.25
初めてpipを使用してOpenCVをインストールする場合は、他の依存関係もインストールする必要があります。そのためには、以下のコマンドを使用してください。
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev $ sudo apt-get install libatlas-base-dev gfortran $ sudo apt-get install libhdf5- dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
すでに多くのRaspberryPi OpenCVプロジェクトを構築しています。さらに多くのインスピレーションを得るために、それをチェックすることもできます。
Raspberry Pi5Inchディスプレイにブザーを追加
ハードウェア側では、5インチのディスプレイとブザー以外はあまりありません。5インチディスプレイをRaspberryPiとインターフェースした後、いくつかのGPIOピンを延長したディスプレイの裏側にブザーを直接取り付けることができます。以下のようにブザーを接続しました-
より多くのI / Oピンを利用することに興味がある場合は、以下のピンの説明が役立ちます。拡張ピンの中にあるように、ほとんどのピンはディスプレイ自体がタッチスクリーンインターフェイスに使用しています。それでも、接続のないピン3、5、7、8、10、11、12、13、15、16、および24があり、独自のアプリケーションに使用できます。このチュートリアルでは、ブザーをGPIO3に接続しました。
CCTVモーション検出用のRaspberryPiのプログラミング
このプロジェクトの完全なPythonスクリプトは、このページの下部にありますが、コードの各セグメントについて説明して、その動作を理解しましょう。
RTSPを使用してRaspberryPiでラグなしで複数のカメラを監視する
この作業を行う上での課題は、ストリーミングの遅延を回避するためにRaspberrypiの負荷を軽減することでした。最初は、4台すべてのカメラを切り替えて動きを探しましたが、非常に時間がかかりました(約10秒)。そこで、4台のカメラすべてを1つの画像に結合し、その画像に対してすべてのモーション検出アクティビティを実行しました。カメラの作成とカメラの読み取りという2つの関数を作成しました。
カメラ の 作成 機能は、それぞれのチャンネル番号でカムを開くために使用されます。RTSP URLは「02」で終わることに注意してください。これは、解像度が低く、したがって読み取りが速いサブストリームビデオフィードを使用していることを意味します。また、使用するビデオコーデックの種類も速度に影響します。さまざまなコードを試してみたところ、FFMPEGが最も高速であることがわかりました。
def create_camera(channel):rtsp = "rtsp://" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ":554 / Streaming / channels /" + channel + "02" #IPを適切に変更yours cap = cv2.VideoCapture(rtsp、cv2.CAP_FFMPEG)cap.set(3、cam_width)#幅のID番号は3ですcap.set(4、cam_height)#高さのID番号は480ですcap.set(10、100 )#明るさのID番号は10リターンキャップ
カメラ の 読み取り 機能では、cam1、cam2、cam3、cam4の4つのカムすべてを読み取り、それらをすべて Main_screen という1つの画像に結合します。このメイン画面の準備ができたら、この画像に対してすべてのOpenCV作業を行います。
def read_camera():success、current_screen = cam1.read()Main_screen = current_screen success、current_screen = cam2.read()Main_screen = current_screen success、current_screen = cam3.read()Main_screen = current_screen success、current_screen = cam4.read() Main_screen = current_screen return(Main_screen)
4つのカムをすべて組み合わせたメイン画面の画像は、次の画像のようになります。
RaspberryPiを使用したOpenCVでのモーション検出
画像の準備ができたので、モーション検出から始めることができます。 whileループ 内では、最初に2つの異なるフレーム、つまりframe1とframe2を読み取り、次にそれらをグレースケールに変換します。
frame1 = read_camera()#最初のフレームを読み取るgrayImage_F1 = cv2.cvtColor(frame1、cv2.COLOR_BGR2GRAY)#灰色に変換frame2 = read_camera()#2番目のフレームを読み取るgrayImage_F2 = cv2.cvtColor(frame2、cv2.COLOR_BGR2GRAY)
次に、これら両方の画像の違いを調べて何が変更されたかを確認し、しきい値を使用して、変更があったすべての場所をブロブのようにグループ化します。鋭いエッジを避けるために、画像をぼかしたり拡張したりすることも一般的です。
diffImage = cv2.absdiff(grayImage_F1、grayImage_F2)#差を取得-これはクールですblurImage = cv2.GaussianBlur(diffImage、(5,5)、0)_、thresholdImage = cv2.threshold(blurImage、20,255、cv2.THRESH_BINARY )dilatedImage = cv2.dilate(thresholdImage、kernal、iterations = 5)
次のステップは、カウンターを見つけて各カウンターの面積を確認することです。面積を見つけることで、動きの大きさを把握できます。領域が変数 motion_detected で指定された値よりも大きい場合、それをアクティビティと見なし、変更の周囲にボックスを描画して、ユーザーに強調表示します。
輪郭、_ = cv2.findContours(dilatedImage、cv2.RETR_TREE、cv2.CHAIN_APPROX_SIMPLE)#輪郭の検索は、輪郭の輪郭の魔法の関数です:#検出されたすべての変更に対して(x、y、w、h)= cv2.boundingRect (contour)#cv2.contourArea(contour)> motion_threshold:cv2.rectangle(frame1、(x、y)、(x + w、y + h)、(255、255、0)の場合、変更が見つかった場所を取得します、1)display_screen = find_screen()
関数 find_screen() は、4台のカメラの中でアクティビティが発生した場所を見つけるために使用されます。モーションのx値とy値がわかっているので、それを見つけることができます。これらのx値とy値を各画面の位置と比較して、どの画面がアクティビティを提供したかを見つけ、その特定の画面を再度トリミングして、piタッチスクリーンに表示できるようにします。
def find_screen():if(x <cam_width):if(y <cam_height):screen = frame1 print( "Activity in cam screen 1")else:screen = frame1 print( "Activity in cam screen 2")else:if (y <cam_height):screen = frame1 print( "Activity in cam screen 3")else:screen = frame1 print( "Activity in cam screen 4")return(screen)
モーション検知用アラーム設定
どの画面で動きが検出されたかがわかれば、必要なあらゆるタイプのアラームを簡単に追加できます。ここでは、GPIO 3に接続されたブザーを鳴らします 。if ステートメントは、画面3でモーションが検出されたかどう か を確認し、 trig_alarm という変数をインクリメントします。選択した任意の画面を検出できます。複数の画面でも検出できます。
if((x> cam_width)and(y
trig_alarm の値が3を超えると、ブザーが1回鳴ります。このカウントの理由は、時々私が影や鳥が偽の警報を作成したことに気づいたからです。したがって、この方法では、3フレームの継続的なアクティビティがある場合にのみ、アラームが発生します。
if(trig_alarm> = 3):#conts 3モーションを待つ#ブザーを鳴らすGPIO.output(BUZZER、1)time.sleep(0.02)GPIO.output(BUZZER、0)trig_alarm = 0
CPUの温度と使用状況の監視
システムは24時間365日動作するようにインデントされているため、Piは非常に高温になる可能性があるため、画面にこれらの値を表示して温度とCPU使用率を監視することにしました。この情報は、gpiozeroライブラリを使用して取得しました。
cpu = CPUTemperature()load = LoadAverage()cpu_temperature = str((cpu.temperature)// 1)load_average = str(load.load_average)#print(cpu.temperature)#print(load.load_average)cv2.putText(display_screen 、cpu_temperature、(250,250)、cv2.FONT_HERSHEY_SIMPLEX、0.4、(0,0,255)、1)cv2.putText(display_screen、load_average、(300,250)、cv2.FONT_HERSHEY_SIMPLEX、0.4、(0,255,0)、2)
PiCCTVモーションディテクターの起動
私はこれを何日もテストして集めましたが、毎回動作し、1台のカメラを損傷するまでは本当に楽しいビルドでした。