OpenCVを使って背景差分
フレーム間差分法は、移動物体の検出方法の1つです。
Python3 + OpenCV で作った結果です。
元のデータはこちら
(わかりづらいですが、波打ち際の水しぶきって感じの動画です)
ではサンプルプログラムです。
movieSample.py
import cv2
import numpy as np
import time
i = 0 # カウント変数
th = 30 # 差分画像の閾値
# 動画ファイルのキャプチャ
cap = cv2.VideoCapture("/Users/.../.../.../movies/movieSample.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)
# 背景画像を表示(モノクロ)
cv2.imshow("Background", bg)
# 待機(0.03sec)
time.sleep(0.03)
i += 1 # カウントを1増やす
# 背景画像の更新(一定間隔)
if(i > 30):
ret, bg = cap.read()
bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)
i = 0 # カウント変数の初期化
# xキーが押されたら途中終了
if cv2.waitKey(1) & 0xFF == ord('x'):
break
cap.release()
cv2.destroyAllWindows()
試しにOpenCVは別途インストールが必要かもしれません。
環境に合わせてトライしてみてください。
Macをご利用の方ならターミナルから
$ python3 -m pip install opencv-python [ENTER]
でいけるんじゃないかな、と思います。
インストールについてはK Igarashiさんが紹介してくださっています。
pip で OpenCV のインストール