2

私はOpenCVにかなり慣れていないので、現時点で立ち往生しています。私はビデオではなく画像を扱っています。プロジェクトのバックグラウンドが同じなので、バックグラウンドを削除できれば作業しやすいと思いました。しかし、最初に、私は一つのことを尋ねなければなりません。画像に BackgroundSubtractorMOG2 を使用できますか? 動画解析・モーション解析というタイトルの下にあるので。

opencv.org のドキュメントを読み、無数の例/チュートリアルを調べましたが、MOG2 の仕組みを理解するのにまだ苦労しています。

簡単な質問: パラメータの履歴とは何ですか?

ということで、簡単なコードを書いてみました。前景マスクを取得します。では、次のステップは何ですか?背景を削除してオブジェクトのみを残すにはどうすればよいですか? MOG2 がバックグラウンド減算を実行できるように、最初にバックグラウンドをロードしてから実際の画像をロードするべきではありませんか?

OpenCV 2.4.11 を使用しています。

コード:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>

using namespace cv;
using namespace std;

//global variables
int history = 1;
float varThreshold = 16;
bool bShadowDetection = true;

Mat src; //source image
Mat fgMaskMOG2; //fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor

int main(int argc, char* argv[])
{
    //create GUI windows
    namedWindow("Source");
    namedWindow("FG Mask MOG 2");

    src = imread("bluePaper1.png", 1);

    //create Background Subtractor objects
    pMOG2 = new BackgroundSubtractorMOG2(history, varThreshold, bShadowDetection); //MOG2 approach
    pMOG2->setInt("nmixtures", 3);
    pMOG2->setDouble("fTau", 0.5);

    pMOG2->operator()(src, fgMaskMOG2);

    imshow("Source", src);
    imshow("FG Mask MOG 2", fgMaskMOG2);

    waitKey(0);

    return 0;
}

ソース画像: bluePaper1.png

MOG2 から取得した fgMask: fgMask.png

4

1 に答える 1

2

ガウス法の混合は、固定カメラのフレームの履歴に従って背景を学習するため、1 つの画像だけに使用することはできません。history パラメータは、背景の構築に影響を与えるフレーム数を示します。

影の検出は、BGS メソッドに依存するプロセスではなく、一緒に実装する必要があります。たとえば、MOG2 のドキュメントには次のようなものがあります。

ピクセルが背景の暗いバージョンである場合、影が検出されます。Tau は、影をどれだけ暗くできるかを定義するしきい値です。Tau= 0.5 は、ピクセルが 2 倍以上暗い場合、それは影ではないことを意味します

あなたの例の場合、前景は単純なフレームの違いで簡単に取得でき、前述のソリューションで影を簡単に削除できます。

次の手順でフォアグラウンドを取得できます。

  1. 既知の背景から特定の画像を減算し、結果をしきい値処理して前景マスクを取得します
  2. 前景マスクと指定された画像に AND 演算を適用して、影のあるオブジェクトを取得します。
  3. 背景の対応するピクセルよりも暗いピクセル (その量を調整する必要があります) を削除します。
  4. より良い結果を得るために、形態学的および接続コンポーネントのラベル付けなどの後処理を行います。
于 2015-07-28T06:34:43.803 に答える