![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
背景差分は、多くのビジョンベースのアプリケーションにおける主要な前処理の一つである。例えば、静止カメラが部屋に出入りする来訪者の数を数える来訪者カウンタや、車両に関する情報を抽出する交通カメラなどの場合を考えてみる。これらすべての場合において、まず人物や車両だけを抽出する必要がある。技術的には、静止した背景から動いている前景を抽出する必要がある。
来訪者のいない部屋の画像や車両のいない道路の画像など、背景だけの画像があれば、それは簡単な作業である。新しい画像から背景を差し引くだけで、前景の物体だけが得られる。しかしほとんどの場合、そのような画像がない可能性があるため、手元にある画像から背景を抽出する必要がある。車両の影がある場合はさらに複雑になる。影も動いているため、単純な差分ではそれも前景としてマークしてしまう。これが事を複雑にする。
OpenCV.js はこの目的のために1つのアルゴリズムを実装しており、非常に簡単に使用できる。
これは混合ガウス分布に基づく背景/前景のセグメンテーション(領域分割)アルゴリズムである。Z.Zivkovic による2本の論文、2004年の "Improved adaptive Gaussian mixture model for background subtraction" および2006年の "Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction" に基づいている。このアルゴリズムの重要な特徴の一つは、各ピクセルに対して適切な数のガウス分布を選択することである。これにより、照明変化などによって変化するシーンへの優れた適応性が得られる。
コーディングの際には、コンストラクタを使用する: cv.BackgroundSubtractorMOG2 (history = 500, varThreshold = 16, detectShadows = true)
| history | 履歴の長さ。 |
| varThreshold | ピクセルがそのサンプルに近いかどうかを判定するための、ピクセルとサンプル間の二乗距離に対するしきい値。この引数は背景の更新には影響しない。 |
| detectShadows | true の場合、アルゴリズムは影を検出してマークする。速度がわずかに低下するため、この機能が不要な場合はパラメータを false に設定する。 |
前景マスクを取得するには apply (image, fgmask, learningRate = -1) メソッドを使用する
| image | 次のビデオフレーム。浮動小数点フレームはスケーリングせずに使用され、[0,255] の範囲内である必要がある。 |
| fgmask | 8ビットのバイナリ画像としての出力前景マスク。 |
| learningRate | 背景モデルがどれだけ速く学習されるかを示す0〜1の値。負のパラメータ値を指定すると、アルゴリズムは自動的に選択された学習率を使用する。0は背景モデルがまったく更新されないことを意味し、1は背景モデルが直前のフレームから完全に再初期化されることを意味する。 |