Kinaconの技術ブログ

Ubuntuはじめました。

OpenCVで背景差分をやってみた。

f:id:m-oota-711:20190313205811p:plain

ディープラーニングのアノテーション画像を作成するときに
オブジェクトの位置を自動で検出するのに使えないかと思い、試してみた。


目次


作業環境

  • Ubuntu 18.04.2 LTS
  • OpenCV 3.4.4
  • OpenCV-Contrib 3.4.4
  • Python 3.6.7


コード

  • 背景差分処理をすべての手法実行する
  • 背景用画像(background_image.png)と検出対象画像(test_image.png)を使用
  • 結果画像(手法名_resoult.jpg)をoutput_dirに保存する。
  • GMG,CNT,KNNは背景モデルの構築に数フレーム読み込む必要がある
    (今回はデフォルトのフレーム数だけ同じ背景画像を読み込む)


#/usr/bin/python3

import cv2
import numpy as np
import os
 
input_dir = "./backgroundsub_image"
output_dir = "./backgroundsub_output"
os.makedirs(output_dir, exist_ok=True)

# 画像の読み込み 第2引き数を1:カラー,0:グレイスケール
img_background = cv2.imread(input_dir + "/background_image.png", 1)
img_src = cv2.imread(input_dir + "/test_image.png", 1)

# 手法の設定
fgbgs_dict = {
    'MOG' : cv2.bgsegm.createBackgroundSubtractorMOG(),
    'LSBP' : cv2.bgsegm.createBackgroundSubtractorLSBP(),
    'GMG' : cv2.bgsegm.createBackgroundSubtractorGMG(),
    'GSOC' : cv2.bgsegm.createBackgroundSubtractorGSOC(),
    'CNT' : cv2.bgsegm.createBackgroundSubtractorCNT(),
    'MOG2' : cv2.createBackgroundSubtractorMOG2(),
    'KNN' : cv2.createBackgroundSubtractorKNN()
}

for key in fgbgs_dict.keys():
    
    fgbg = fgbgs_dict[key]

    # 背景差分実行
    if key == 'GMG' or key == 'KNN' or key == 'CNT':
        # GMG,KNN,CNTは背景のモデル構築に最初の数フレームを使用するため
        if key == 'GMG': #120 + 1
            frame = fgbg.getNumFrames() + 1
        if key == 'KNN': #7
            frame = fgbg.getNSamples()
        if key == 'CNT': #15
            frame = fgbg.getMinPixelStability()
        
        for i in range(frame):
            fgmask = fgbg.apply(img_background)
    else:
        fgmask = fgbg.apply(img_background)
    
    fgmask = fgbg.apply(img_src)

    # 手法名を描画する
    cv2.putText(fgmask, key, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (100, 100, 100), thickness=2)

    # 表示
    cv2.imshow('frame',fgmask)

    # 検出画像
    bg_diff_path  = output_dir + '/{}_resoult.jpg'.format(key)
    cv2.imwrite(bg_diff_path,fgmask)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

実行結果

背景画像

f:id:m-oota-711:20190226183105p:plain

検出対象画像

f:id:m-oota-711:20190226183124p:plain

処理結果

f:id:m-oota-711:20190226183140p:plain

f:id:m-oota-711:20190226183156p:plain

f:id:m-oota-711:20190226183213p:plain

f:id:m-oota-711:20190226183231p:plain

f:id:m-oota-711:20190226183250p:plain

f:id:m-oota-711:20190226183310p:plain

f:id:m-oota-711:20190226183328p:plain


以上。