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

  • URLをコピーしました!

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

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

\OpenCVを使った画像処理を学びたい人には自宅で学べるUdemyがおすすめ!  /

講座単位で購入できます!

目次

Raspberry Piとは

ラズベリーパイ(Raspberry Pi)はイギリスのラズベリーパイ財団が教育用に開発したボードコンピュータです。

最新のRaspberry Pi 4では、ARMアーキテクチャを採用したBroadcom製の高性能SoC BCM2711を搭載しており、1.5GHzで動作するARM Cortex-A72が4コアとマイコンボードの中では非常に高速な処理能力を持っています。また、ユーザーがアクセス可能な40ピンのGPIOも搭載しており、外部ハードウェアを制御することが可能です。

詳細なスペック等は以下の記事で解説していますので、あわせてご覧ください。

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の以下の講座もお勧めです。

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

また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。

スキルアップや副業にぜひ活用してみてください。

スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。

講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。


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

\OpenCVを使った画像処理を学びたい人には自宅で学べるUdemyがおすすめ!  /

講座単位で購入できます!

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