2015-07-12 324 views
1

我对OpenCV来说很新,而且我一直在卡住。我正在处理图像,而不是视频。由于我在我的项目中拥有相同的背景,因此如果我能够删除背景,我认为工作起来会更容易。但首先,我必须要问一件事。我可以将BackgroundSubtractorMOG2用于图像吗?因为它是在视频分析/运动分析标题下。如何使用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

fgMask,我从MOG2得到:根据一帧的历史 fgMask.png

+0

“我可以用BackgroundSubtractorMOG2图片?” - 号背景减除株从静态背景搬东西。你想要的更像是'分割'(静态图像中的不同对象) – berak

+0

@berak好的,我明白了。那么,你会推荐什么去除阴影?因为我想要使用MOG2的主要原因是去除阴影。 – massakrienen

+0

您也可以将BackgroundSubtractorMOG2与图像一起使用,但您应该只有足够的背景(没有内部对象的场景),然后过滤其他图像。 – Shepard

回答

2

高斯方法的混合学习背景固定相机,所以你不能仅用于一个图像。历史参数显示多少帧将对背景的构建产生影响。

阴影检测是不依赖于BGS方法和应一起实现的过程。 例如MOG2文档中,我们有:如果该像素是背景颜色暗的版本被检测到

阴影。 Tau是定义影子可以变得多暗的阈值。 Tau = 0.5意味着如果像素超过两倍而不是阴影

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

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

  1. 减去已知背景给定的图像和门槛结果获得前景蒙
  2. 应用与操作上的前景蒙和给定的图像让你的对象有可能的阴影。
  3. 删除比背景中对应的像素更暗(应该调整的量)的像素。
  4. 做一些后处理,如形态学和连接组件标签,以获得更好的结果。