LoginSignup
2
3

More than 3 years have passed since last update.

OpenCVでフレーム間差分法を実装

Posted at

OpenCVを使って背景差分

フレーム間差分法は、移動物体の検出方法の1つです。
Python3 + OpenCV で作った結果です。

元のデータはこちら
(わかりづらいですが、波打ち際の水しぶきって感じの動画です)
スクリーンショット 2020-06-17 22.54.43.jpg

二値化したマスク画像がこちら
スクリーンショット 2020-06-17 22.39.08.jpg

これ、一応動画です
スクリーンショット 2020-06-17 22.40.01.jpg

背景画像の表示
スクリーンショット 2020-06-17 22.40.50.jpg

ではサンプルプログラムです。

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 のインストール

2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3