Feel Physics Backyard

HoloLensの出張授業をする会社で、教材を開発しています

画像処理(OpenCV for Python)で背景除去(MoG)

混合正規分布(Mixture of Gaussian Distribution, MoG)による背景差分(背景を除去する)アルゴリズムを試してみました。

背景差分 - Wikipedia

背景差分を適用する上で,前景領域に影が含まれてしまう,背景物体が風などで揺れる,太陽の位置や雲の動きにより照明環境が変化する,といった問題が課題としてあげられる. 前景領域に影が含まれる問題に対しては,多くの場合に前述の色度を用いた解決がなされる.背景物体が揺れる問題に対しては混合正規分布(Mixture of Gaussian Distribution, MoG)を用いた背景のモデル化などによる対処が最も有名である.MoGは新たに観測された画像を用いて逐次的に背景モデルを更新することから,太陽の位置の変化のような,ゆっくりとした照明環境の変化にも対処できる.ただし,雲間が晴れた場合のような急激な照明環境の変化には対処が難しく,そのような変化には別途対処する必要がある.

しかし、視野の中を行ったり来たりすると前景が「これは背景である」とご認識されてしまうようです。動きが一定の方向になるような、車の走行する道路を映した動画から車を抽出するには良さそうですが、今回のケースでは、なかなか難しいですね。

# coding=utf-8
import cv2
cap = cv2.VideoCapture(0)
fgbg = cv2.BackgroundSubtractorMOG()

while True:
    ret, src = cap.read()
    fgmask = fgbg.apply(src, learningRate=0.01)
    dst = src.copy()
    dst = cv2.bitwise_and(src, src, mask=fgmask)

    cv2.imshow('frame',dst)

    k = cv2.waitKey(30) & 0xff
    if k == 27:  # ESC key
        break
cap.release()
cv2.destroyAllWindows()

MOG2、GMGも追って試してみたいと思います。