2

我对 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;
}

源图像: 蓝纸1.png

我从 MOG2 得到的 fgMask: fgMask.png

4

1 回答 1

2

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

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

如果像素是背景的较暗版本,则会检测到阴影。Tau 是一个阈值,定义了阴影可以有多暗。Tau= 0.5 意味着如果一个像素比暗两倍以上,那么它不是阴影

在您的示例中,可以通过简单的帧差轻松获得前景,并且您可以通过上述解决方案轻松去除阴影。

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

  1. 从已知背景中减去给定图像并对结果进行阈值化以获得前景蒙版
  2. 对前景蒙版和给定图像应用 AND 操作,以获取具有可能阴影的对象。
  3. 删除比背景中相应像素更暗的像素(应调整其数量)。
  4. 进行一些后处理,例如形态学和连接组件标记,以获得更好的结果。
于 2015-07-28T06:34:43.803 回答