如何在OpenCV中使用cv::BackgroundSubtractorMOG?

如何在OpenCV中使用cv::BackgroundSubtractorMOG?,opencv,computer-vision,background-subtraction,mog,shadow-removal,Opencv,Computer Vision,Background Subtraction,Mog,Shadow Removal,我正在使用OpenCV2.2实现背景减法的运动目标检测。并采用高斯混合模型(GMM)方法对背景参考图像进行建模 我使用OpenCV2.2中提供的cv::BackgroundSubtractorMOG类直接获得前景像素(或前景遮罩)。这很方便,但是cv::BackgroundSubtractorMOG返回的前景掩码不如我预期的好。此外,cv::BackgroundSubtractorMOG的性能似乎不如OpenCV1.0中用C语言编写的GMM方法 以下是我在OpenCV2.2中的代码: cv::B

我正在使用OpenCV2.2实现背景减法的运动目标检测。并采用高斯混合模型(GMM)方法对背景参考图像进行建模

我使用OpenCV2.2中提供的cv::BackgroundSubtractorMOG类直接获得前景像素(或前景遮罩)。这很方便,但是cv::BackgroundSubtractorMOG返回的前景掩码不如我预期的好。此外,cv::BackgroundSubtractorMOG的性能似乎不如OpenCV1.0中用C语言编写的GMM方法

以下是我在OpenCV2.2中的代码:

cv::BackgroundSubtractorMOG mog;
mog(frame, fgMask, 0.01);
那么,我是不是用错了方法

顺便问一下,cv::BackgroundSubtractorMOG是否对前景像素执行阴影移除


非常感谢。

当您创建mog时,您没有定义任何参数,因此它是使用默认参数创建的。每个参数都有一个描述,也许就是这样。试试3,4,5高斯

此函数不执行阴影移除,但您有其他执行此操作的函数。祝你好运

F.X.对的回答给出了

backgroundSubtractor = new BackgroundSubtractorMOG(3, 4, 0.8);

最近有一些去除背景(检测前景)的算法远远优于OpenCV中的标准GMM实现


例如,有一个基于块的分类器级联方法,以及它的基于C++的.< /p> ,我建议使用以下设置来启动。然后可以开始调整参数:

cv::BackgroundSubtractorMOG2 mog;
mog(rawFrame,foregroundFrame,-1);
mog.set("nmixtures", 3);
mog.set("detectShadows",1);   

在本例中,我使用3个高斯混合设置MOG2减法器。我还启用了阴影检测。

但在我的应用程序上运行速度非常慢。我自己也在寻找一些好的参数。使用这个工具,输入目录结构应该是什么样的?无论我怎么说,readdir()似乎都会出错。下面是3.0文档中关于使用OpenCV背景减法函数的有用概述: