【Python/OpenCV】背景差分法で移動物体の検出

この記事では、Python版OpenCVで背景差分法を実装し、移動物体を検出する方法をソースコード付きで解説します。

背景差分法で移動物体の検出

背景差分法は、移動物体の検出方法の1つです。
背景差分法では、入力画像と背景画像の差分を計算することで移動物体を抽出します。
背景差分法を行うには、背景画像を事前に用意する必要があります。
【参考】背景差分法の原理・特徴・計算式

今回は、PythonとOpenCVで簡単な背景差分法を実装してみました。

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

def main():

    i = 0      # カウント変数
    th = 30    # 差分画像の閾値
    
    # カメラのキャプチャ
    cap = cv2.VideoCapture("input.mp4")
    
    # 最初のフレームを背景画像に設定
    ret, bg = cap.read()

    # グレースケール変換
    bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY) 

    while(cap.isOpened()):
        # フレームの取得
        ret,frame = cap.read()
        
        # グレースケール変換
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        # 差分の絶対値を計算
        mask = cv2.absdiff(gray, bg)
        
        # 差分画像を二値化してマスク画像を算出
        mask[mask < th] = 0
        mask[mask >= th] = 255
        
        # フレームとマスク画像を表示
        cv2.imshow("Mask", mask)
        cv2.imshow("Flame", gray)

        i += 1    # カウントを1増やす
        
        # 背景画像の更新(一定間隔)
        if(i > 30):
            ret, bg = cap.read()
            bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY) 
            i = 0 # カウント変数の初期化
            
        # qキーが押されたら途中終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

最初に読み込んだフレームを背景画像にしています。
また、一定間隔(カウント変数iが30になる毎)で背景画像を更新することで照明変化に対応しています。

実行結果

サンプルプログラムの実行結果です。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!