如何使用BackgroundSubtractorMOG2的图像(How to use Backgro

2019-10-23 18:50发布

我非常新的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;
}

图片来源:

fgMask我从MOG2得到:

Answer 1:

高斯方法的混合按照一个固定的摄像头帧的历史背景学习,所以你不能用它只有一个图像。 历史参数显示多帧将如何对建筑背景的效果。

阴影检测是不依赖于BGS方法和应一起实现的过程。 例如MOG2文档中,我们有:

如果该像素是背景颜色暗的版本被检测到的影子。 头是定义阴影多少可以暗是一个门槛。 头= 0.5意味着,如果一个像素的两倍以上暗然后它不影

在您的例子的情况下,前景可以很容易地通过一个简单的帧差来获得,你可以很容易地提及溶液中去除阴影。

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

  1. 从已知的背景和阈值 减去给定的图像的结果来获得前景掩模
  2. 应用及前景蒙版和给定的图像操作可能出现的阴影,让您的对象。
  3. 去除像素,其为暗(量应该调整)中比在背景它们相应的像素。
  4. 做一些后期处理类似的形态和连接成分标签有一个更好的结果。


文章来源: How to use BackgroundSubtractorMOG2 for images