I'm using OpenCV2.2 to implement moving objects detection with the method of Background Subtraction. And I use the Gaussian Mixture Model(GMM) method to model the background reference image.
I directly get the foreground pixels(or foreground mask) by using the class cv::BackgroundSubtractorMOG provided in OpenCV2.2. It's convenient but the foreground mask returned by cv::BackgroundSubtractorMOG is not as good as I expected. In addition, it seems that cv::BackgroundSubtractorMOG performs poorer than the method of GMM wrote in C language provided in OpenCV1.0.
The following is my code in OpenCV2.2:
cv::BackgroundSubtractorMOG mog;
mog(frame, fgMask, 0.01);
So, did I use the method in a wrong way?
By the way, does cv::BackgroundSubtractorMOG perform shadow removal on the foreground pixels?
Thank you very much.
There are recent algorithms which remove backgrounds (detect foreground) far better than the standard GMM implementation in OpenCV.
For example, there is a block-based classifier cascade approach described in this journal article, along with its C++ based source code.
F.X.'s answer on this thread gives sample parameters of
backgroundSubtractor = new BackgroundSubtractorMOG(3, 4, 0.8);
I will recommend using the following settings to get started. Then you can start tuning your parameters:
cv::BackgroundSubtractorMOG2 mog;
mog(rawFrame,foregroundFrame,-1);
mog.set("nmixtures", 3);
mog.set("detectShadows",1);
In this example I set the MOG2 subtractor with 3 Gaussian mixtures. I also enabled shadow detection.
来源:https://stackoverflow.com/questions/10458633/how-to-use-cvbackgroundsubtractormog-in-opencv