OpenCVで背景差分をやってみた。
ディープラーニングのアノテーション画像を作成するときに
オブジェクトの位置を自動で検出するのに使えないかと思い、試してみた。
目次
作業環境
- 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()
実行結果
背景画像
検出対象画像
処理結果
以上。