首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用BackgroundSubtractorMOG2处理图像

如何使用BackgroundSubtractorMOG2处理图像
EN

Stack Overflow用户
提问于 2015-07-12 16:02:14
回答 1查看 13.6K关注 0票数 2

我对OpenCV非常陌生,现在我被困住了。我处理的是图像,而不是视频。因为我的项目有同样的背景,所以我认为如果我能去掉我的背景,我会更容易地工作。但首先,我要问一件事。我可以用BackgroundSubtractorMOG2来处理图像吗?因为它在视频分析/运动分析标题下。

我阅读了关于opencv.org的文档,并阅读了无数的示例/教程,但我仍然很难理解MOG2的工作原理。

简单的问题:参数中的历史是什么?

所以,我写了一个简单的代码。我有个前景面具。那么下一步是什么呢?怎样才能移除背景,只留下我的对象?难道我不应该先加载我的背景,然后是实际的图像,这样MOG2才能做背景减法吗?

我使用的是OpenCV 2.4.11。

代码:

代码语言:javascript
复制
#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:

EN

回答 1

Stack Overflow用户

发布于 2015-07-28 06:34:43

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

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

如果像素是背景的较暗版本,则检测阴影。τ是一个阈值,它决定了阴影有多暗。Tau= 0.5意味着如果一个像素超过两倍暗,那么它就不是阴影

如果您的例子,前景可以很容易地获得一个简单的帧差,你可以很容易地消除阴影通过上述的解决方案。

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

  1. 从已知背景中减去给定图像和阈值,得到前景掩码。
  2. 应用和操作前景掩码和给定的图像,以获得您的对象与可能的阴影。
  3. 删除比背景中相应像素更暗的像素(应该调整其数量)。
  4. 做一些后处理,如形态学和连接成分标记,以获得更好的效果。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31369757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档