我是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;
}
来源图片:
我从MOG2得到的fgMask:
答案 0 :(得分:2)
高斯方法的混合方法根据固定相机中的帧历史来学习背景,因此您不能仅将其用于一个图像。 history参数显示有多少帧会对构造背景产生影响。
阴影检测不是一个依赖于BGS方法的过程,应该同时实施。 例如,我们在MOG2文档中有:
如果像素是背景的较暗版本,则会检测到阴影。 Tau是一个阈值,用于定义阴影的暗度。 Tau = 0.5意味着如果一个像素的深度超过两倍,那么它就不是阴影
如果您的示例可以通过简单的帧差异轻松获得前景,您可以通过上述解决方案轻松删除阴影。
您可以通过以下步骤获得前景: