如何使用BackgroundSubtractorMOG2的图像

时间:2015-07-12 16:02:15

标签: c++ opencv image-processing background-subtraction mog

我是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

1 个答案:

答案 0 :(得分:2)

高斯方法的混合方法根据固定相机中的帧历史来学习背景,因此您不能仅将其用于一个图像。 history参数显示有多少帧会对构造背景产生影响。

阴影检测不是一个依赖于BGS方法的过程,应该同时实施。 例如,我们在MOG2文档中有:

  

如果像素是背景的较暗版本,则会检测到阴影。 Tau是一个阈值,用于定义阴影的暗度。 Tau = 0.5意味着如果一个像素的深度超过两倍,那么它就不是阴影

如果您的示例可以通过简单的帧差异轻松获得前景,您可以通过上述解决方案轻松删除阴影。

您可以通过以下步骤获得前景:

  1. 从已知背景中减去给定图像,阈值获得前景蒙版的结果
  2. 对前景蒙版和给定图像应用AND操作以使对象具有可能的阴影。
  3. 删除比背景中相应像素更暗的像素(应调整的数量)。
  4. 进行一些后处理,如形态学和连通成分标记,以获得更好的结果。