Python3 OpenCV3で背景差分を求める

ある道を定点カメラで撮影している時に人がうつりこんできたら、その前の背景の差分を求めて人を抽出するような処理。

[amazonjs asin="4061538225″ locale="JP" title="OpenCVによる画像処理入門 (KS情報科学専門書)"]

 

前提

ディレクトリ構成などはこことかこことか。

 

元画像

ダンボーの画像(dambo.jpg, dambo2.jpg) をsource/imageディレクトリに設置する。

dambo1

 

dambo2

 

背景差分

背景差分をを求める。
sourceディレクトリにbackground_substraction.pyを作成する。

[python title="background_substraction.pyの内容"]
# -*- coding: UTF-8 -*-

import cv2
import math
import numpy as np
import os

if __name__ == '__main__’:

# 画像の読み込み
img_src1 = cv2.imread("./image/dambo1.jpg", 1)
img_src2 = cv2.imread("./image/dambo2.jpg", 1)

# 背景画像との差分を算出
img_diff = cv2.absdiff(img_src2, img_src1)

# 差分を二値化
img_diffm = cv2.threshold(img_diff, 20, 255, cv2.THRESH_BINARY)[1]

# 膨張処理、収縮処理を施してマスク画像を生成
operator = np.ones((3, 3), np.uint8)
img_dilate = cv2.dilate(img_diffm, operator, iterations=4)
img_mask = cv2.erode(img_dilate, operator, iterations=4)

# マスク画像を使って対象を切り出す
img_dst = cv2.bitwise_and(img_src2, img_mask)

# 表示
cv2.imshow("Show BACKGROUND SUBSTRACTION Image", img_dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

[/python]

実行。

[shell]
(opencv_python)$ python background_substraction.py
[/shell]

スクリーンショット 2015-07-15 0.15.22

 

あまり綺麗に取得できなかった。
カメラで撮影したため、影などが入ったからかもしれない。