↓もし、良かったらSNSでの紹介よろしくお願いします。

12行で動体検知!?OpenCV(Python)

bootstrap

12行で動体検知

avi_000030235

人が歩く動画”vtest.avi”を動体(白色)、背景(黒色)、影(灰色)の動画に変換して表示するスクリプト(12行)を書きました。下記のサンプルコードはOpenCV-Pythonチュートリアルを参考にしています。また、”vtest.avi”はチュートリアルからダウンロードできます。

実行環境

  • Python3
  • OpenCV3.3(OpenCV2系では動かなかった。)

サンプルコード

import cv2
cap = cv2.VideoCapture('vtest.avi')
fgbg = cv2.createBackgroundSubtractorMOG2()
while(1):
    ret, frame = cap.read()
    k = cv2.waitKey(30) & 0xff
    if k == 27 or not ret:
        break
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame',fgmask)
cap.release()
cv2.destroyAllWindows()

実行結果

下記のように動体(人)が白、背景が黒、影が灰色といった具合に分けられています。ちなみに下記のgifは圧縮のためカクカクになってますが実際の実行結果はなめらかです。

threading_sunflower

ざっくりとした解説

動体検出機のインスタンスを生成します。動体検出はフレーム間の差分を使うので、それらをこのインスタンスが管理してます。動体検出機は他にBackgroundSubtractorMOG、BackgroundSubtractorGMGがあります。BackgroundSubtractorGMGは私の環境では呼び出せませんでした。

fgbg = cv2.createBackgroundSubtractorMOG2()

applyするとフレームを読み込んでマスク画像に変換します。

fgmask = fgbg.apply(frame)