私は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;
}
ソース画像:
MOG2 から取得した fgMask: