我对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;
}
源图像:
fgMask,我从MOG2得到:根据一帧的历史
“我可以用BackgroundSubtractorMOG2图片?” - 号背景减除株从静态背景搬东西。你想要的更像是'分割'(静态图像中的不同对象) – berak
@berak好的,我明白了。那么,你会推荐什么去除阴影?因为我想要使用MOG2的主要原因是去除阴影。 – massakrienen
您也可以将BackgroundSubtractorMOG2与图像一起使用,但您应该只有足够的背景(没有内部对象的场景),然后过滤其他图像。 – Shepard