Raspberry PiとOpenCVでカメラ映像の動体検知をする方法

  • URLをコピーしました!

今回はRaspberry Pi 4とWebカメラを使って、動いているものを画像処理で検出する動体検知システムを実装する方法について解説します。画像処理ライブラリにはOpenCVを利用しPythonでコーディングを行いました。

当サイトでこれまで公開したOpenCVの活用事例についても以下の記事で解説していますので、あわせてご覧ください。

また、OpenCVを動画で学びたい方向けに以下の講座がおすすめです。

【初心者向けAI・IoT講座】 ラズベリーパイ(Raspberry Pi)とOpenCVで作る簡単画像認識システム
目次

Raspberry Piとは

今回、動体検知のアプリケーションを実装するマイコンボード Raspberry Pi 4を使用します。Raspberry Pi 4についてのスペックやセットアップ方法については以下の記事で解説しています、

OpenCVとは

画像処理ライブラリOpenCVについては以下のページで解説しています。

OpenCVのインストール

Raspberry Pi環境でのOpenCVのインストール方法については、以下のページで解説しています。

使用するハードウェア

今回使用するハードウェアはRaspberry Pi 4とUSB接続のWebカメラ、ロジクールのC270を使用します。

WebカメラC270をPythonのプログラムから制御し、画像処理を行います。
C270で取り込んだ映像の中に動体が検出された場合は、動体の周りに緑の枠線を描画します。

C270は標準でドライバーが搭載されていますので、Raspberry Piに接続するだけで自動的に認識されます。

作成したソースコード

カメラで撮影した動画の動体検知を行うため、以下のソースコードを作成しました。

import cv2

#VideoCaptureオブジェクト取得
cap = cv2.VideoCapture(-1)

print("start")

avg = None

while(True):
    #フレームを取得
    ret, frame = cap.read()
    
    if not ret:
        print("not capture")
        break
        
    #動体検知処理
    #グレースケールに変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 比較用にフレームの切り出し保存
    if avg is None:
        avg = gray.copy().astype("float")
        continue

    #現在のフレームと移動平均との差を計算
    cv2.accumulateWeighted(gray, avg, 0.5)
    frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

    #画像を2値化する
    thresh = cv2.threshold(frameDelta, 3, 255, cv2.THRESH_BINARY)[1]

    #輪郭を抽出する
    contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]

    # 差分があった点を画面に描く
    for target in contours:
        x, y, w, h = cv2.boundingRect(target)

        if w < 30: continue #条件以下の変更点は除外

        #動体の位置を描画
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0,255,0), 2)

    #画像表示
    cv2.imshow("Frame", frame)
    
    #キーボード入力処理
    key = cv2.waitKey(1)
    if key == 13: #enterキーの場合処理を抜ける
        break
        
#カメラデバイスクローズ
cap.release()

#ウィンドウクローズ
cv2.destroyAllWindows()

実行結果

実際にプログラムを動作させた際の、Webカメラの映像です。
リアルタイムに動いている部分を検出し、枠線を描画することができました。

まとめ

今回はRaspberry Pi 4に取り付けたカメラで撮影した動画の動体検知をOpenCVを使ってリアルタイムに行う方法を解説してみました。今回のアプリケーションを応用する(動体を検知したら録画を開始するなど)ことで、監視カメラなどにも活用できるかと思いますので、ぜひ試してみてください。

また、OpenCVをさらに深く学びたい方にはUdemyの以下の講座もお勧めです。

【Pythonで学ぶ】OpenCVでの画像処理入門 icon


それでは、また次の記事でお会いしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
目次