Python

【Python】OpenCVを使って動体検知をする方法を徹底解説!【カメラでも動画でもOK】

【Python】OpenCVを使って動体検知をする方法を徹底解説!【カメラでも動画でもOK】

こんにちは、さすを(@sasuwo0409)です。

先日、下記ツイートをしました。

Pythonを使って動体検知してみました!

感度を細かく設定できるのがよい!🙆

お留守番中のG対策に使えるかも(絶対にいや)🥶

#プログラミング
#Python
#駆け出しエンジニアと繋がりたい

今回の記事は、Pythonを使って、動体検知をする方法を解説していきます。

サンプルコードも載せているので、実際に試してみることも可能です。

動体検知をしたい方やカメラ・動画を使ったプログラムを書いてみたい人はぜひ試してみてください。

それでは本文をどうぞ。

困っている人
困っている人

手っ取り早く動体検知をしてみたいな。

あと、理解を深めたいから、サンプルコードが何をしているのかもわかるように教えて欲しい。。。

さすを
さすを

これらの悩みを解決します!

この記事を読むとわかること:

  • Pythonを使って動体検知をする方法
  • 使用しているプログラム内容の意味

筆者の情報:

  • 現役システムエンジニア 兼 ブロガー
  • 過去に6,000万のPython案件を受注
  • 最近ハマっていることは機械学習

※0円のサンプルテキストという近道
独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストをもらえるので、これを使ってPythonの基礎を学ぶのもありだと思います。

>>techgymの無料サンプルテキストはこちらから

スポンサーリンク

【Python】OpenCVを使って動体検知をする方法!

プログラム作成時の環境

  • OS : Windows10
  • Pythonのバージョン:3.9.0
  • OpenCVのバージョン:4.5.2
  • 使用エディタ:Visual Studio Code

この記事ではVisual Studio Code上でプログラムを動かしていますが、プログラムが書けるエディタであれば問題ありません。

既にインストールされている方はそちらを使っていただければと思います。

エディタがないと、プログラムを書くことがほとんどできないので、まだインストールされていない方はこの機会にインストールしてしまいましょう。

>>ソースコードエディタ(VSCode)のインストール方法[Windows版]
>>ソースコードエディタ(VSCode)のインストール方法[Mac版]

ライブラリのインストール

これから紹介するプログラムではOpenCVというライブラリを使用しています。

ライブラリのインストールが済んでいない方は「【これだけ知っておけばOKです】 現役エンジニアもよく使う便利なPythonライブラリ22選」からOpenCVをインストールしてください。

さすを
さすを

この記事に取り上げられているライブラリは、どれも使い勝手がいいので、まだインストールしていないものがあれば、ついでにインストールしておくのがおすすめです!

サンプルコード

今回のサンプルコードでは、以下の処理を行うようにしています。

処理内容:

  • 搭載されているWebカメラで動体検知を行う
  • 初めて動体検知が行われたときにその情報をファイル保存する
  • 100回目に動体検知が行われたときにその情報をファイル保存する

実際のサンプルコードは以下の通りです。

# 必要なライブラリのインポート
import cv2
import datetime

# Webカメラを使うときはこちら
cap = cv2.VideoCapture(0)

# ファイルパスで動画を読み込むときはこちら
# filepath = "読み込みたい動画ファイルのあるパスを入力する"
# cap = cv2.VideoCapture(filepath)


before = None
count = 1
time = datetime.date.today()

print("動体検知を開始します。")
print(str(datetime.datetime.now()))

while True:
    # 画像を取得
    ret, frame = cap.read()

    # 再生が終了したらループを抜ける
    if ret == False:
        break

    # 白黒画像に変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    if before is None:
        before = gray.astype("float")
        continue

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

    # frameDeltaの画像を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 

        areaframe = cv2.rectangle(frame, (x, y), (x+w, y+h), (0,255,0), 2)

        if count == 1 or count == 100:
            cv2.imwrite('保存するファイル名',areaframe)
        count = count + 1

    # ウィンドウで表示
    cv2.imshow('target_frame', frame)

    # Enterキーが押されたらループを抜ける
    if cv2.waitKey(1) == 13: break

print("動体検知を終了します。")
print(str(datetime.datetime.now()))

# ウィンドウの破棄
cv2.destroyAllWindows()
  • VideoCaptureの引数:カメラが1台しか接続されていない場合は「0」、複数台接続されている場合は、0から(接続台数-1)のどれかを指定する
  • 変更点の値:51行目の値を小さくすればするほど、動体検知の感度が上がる

冒頭でも紹介しましたが、実行結果はこちらです。

動体検知を開始します。
2021-12-13 15:28:11.748773
動体検知を終了します。
2021-12-13 15:29:11.711463
図1:実行結果(ファイル出力)
図1:実行結果(ファイル出力)
さすを
さすを

動体検知と画像保存がされていることを確認できました!

動体検知をすると画像・映像に対する理解が深まる

動体検知や画像編集は実際に目で見えるので、とっかかりやすい内容ですが、それ以上に画像・映像に対する理解が深まります。

例えば、以下のような用語などです。

  • フレーム:動画を構成する一枚一枚の静止画(コマ)
  • 移動平均:時系列データの中のノイズ・外れ値を除去する手法
  • 2値化:白黒画像から作成することができる閾値処理

これらの内容は、画像・映像処理をするうえで当たり前の知識として扱われます。

動体検知はプログラムがそこまで複雑ではなく、基本的な用語や計算方法が使われているので、画像・映像に対する理解を深めるのに適しています。

さすを
さすを

「こんな処理が必要なんだなあ」くらいの理解度で大丈夫です!

最後に:身近なものも結構簡単に作れる

Pythonを使って動体検知をする方法を解説してきました。

防犯カメラやバックカメラも動体検知が使われているので、なじみがあると感じたかもしれません。

今回紹介した動体検知システムなら、コピペですぐに作ることができるので、興味があったら試してみてください。

そして、

「追加でこんな機能を搭載したよ!」

というようなことがあれば、教えていただけると僕もうれしいです。

この記事があなたの役に少しでも立てていたらうれしいです!

それでは!


コメント

タイトルとURLをコピーしました