OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
背景差分

目的

本章では、

  • OpenCVで利用できる背景差分の手法に慣れる。

基礎

背景差分は、多くのビジョンベースのアプリケーションにおける主要な前処理ステップである。例えば、固定カメラが部屋に出入りする来訪者の数をカウントする来訪者カウンターの場合や、車両に関する情報を抽出する交通カメラの場合などを考えてみる。これらすべての場合において、まず人物や車両だけを抽出する必要がある。技術的には、静止した背景から動いている前景を抽出する必要がある。

来訪者のいない部屋の画像や車両のいない道路の画像のように、背景だけの画像があれば、これは簡単な作業である。新しい画像から背景を差し引くだけで、前景の物体だけが得られる。しかし、ほとんどの場合、そのような画像を持っていないことが多いため、手元にある画像から背景を抽出する必要がある。車両の影がある場合、さらに複雑になる。影も動くため、単純な差分ではそれも前景としてマークしてしまう。これが事態を複雑にする。

この目的のためにいくつかのアルゴリズムが提案されてきた。以下では、bgsegmモジュールの2つのアルゴリズムを見ていく。

BackgroundSubtractorMOG

これはガウス混合ベースの背景/前景セグメンテーションアルゴリズムである。P. KaewTraKulPongとR. Bowdenによる2001年の論文「An Improved Adaptive Background Mixture Model for Realtime Tracking with Shadow Detection」で紹介された。各背景ピクセルをK個のガウス分布の混合(K = 3〜5)でモデル化する手法を用いる。混合の重みは、それらの色がシーン内に留まる時間の割合を表す。背景である可能性が高い色は、より長くより静的に留まるものである。

コーディングでは、関数cv.bgsegm.createBackgroundSubtractorMOG()を使って背景オブジェクトを作成する必要がある。これには履歴の長さ、ガウス混合の数、しきい値などのいくつかの省略可能なパラメータがある。すべてデフォルト値に設定されている。次に、ビデオループ内でbackgroundsubtractor.apply()メソッドを使って前景マスクを取得する。

以下に簡単な例を示す:

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while(1):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
cv.imshow('frame',fgmask)
k = cv.waitKey(30) & 0xff
if k == 27:
break
cap.release()
Class for video capturing from video files, image sequences or cameras.
Definition videoio.hpp:790
Ptr< BackgroundSubtractorMOG > createBackgroundSubtractorMOG(int history=200, int nmixtures=5, double backgroundRatio=0.7, double noiseSigma=0)
Creates mixture-of-gaussian background subtractor.
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void destroyAllWindows()
Destroys all of the HighGUI windows.

(すべての結果は比較のために最後に示す)。

覚え書き
より新しい手法cv.createBackgroundSubtractorMOG2()に関するドキュメントはこちらで見つけられる: 背景差分の手法の使い方

BackgroundSubtractorGMG

このアルゴリズムは、統計的な背景画像推定とピクセルごとのベイズ的セグメンテーションを組み合わせる。Andrew B. Godbehere、Akihiro Matsukawa、Ken Goldbergによる2012年の論文「Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation」で紹介された。論文によると、このシステムは2011年3月31日から7月31日まで、カリフォルニア州サンフランシスコのContemporary Jewish Museumで「Are We There Yet?」という成功したインタラクティブなオーディオアートインスタレーションを稼働させた。

背景のモデリングに最初の数フレーム(デフォルトでは120フレーム)を使用する。ベイズ推定を用いて前景の可能性がある物体を識別する確率的前景セグメンテーションアルゴリズムを採用している。推定は適応的であり、変動する照明に対応するために、古い観測よりも新しい観測の方が重く重み付けされる。クロージングやオープニングのようないくつかのモルフォロジーフィルタリング処理が、不要なノイズを除去するために行われる。最初の数フレームでは黒いウィンドウが表示される。

ノイズを除去するために、結果にモルフォロジーのオープニングを適用するとよい。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(3,3))
while(1):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
fgmask = cv.morphologyEx(fgmask, cv.MORPH_OPEN, kernel)
cv.imshow('frame',fgmask)
k = cv.waitKey(30) & 0xff
if k == 27:
break
cap.release()
Ptr< BackgroundSubtractorGMG > createBackgroundSubtractorGMG(int initializationFrames=120, double decisionThreshold=0.8)
Creates a GMG Background Subtractor.
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue())
Performs advanced morphological transformations.
Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))
Returns a structuring element of the specified size and shape for morphological operations.

結果

元のフレーム

以下の画像はビデオの200番目のフレームを示している

image

BackgroundSubtractorMOGの結果

image

BackgroundSubtractorGMGの結果

モルフォロジーのオープニングでノイズが除去されている。

image

追加リソース

演習