如何使用OpenCV BackgroundSubtractorMOG2获取移动对象的掩码

Als*_*ton 3 opencv background mask object foreground

我想屏蔽视频中的移动物体.我发现OpenCV有一些内置的BackgroundSubtractors可以节省我的时间.但是,根据官方参考,功能:

void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)
Run Code Online (Sandbox Code Playgroud)

应该输出一个掩码,fgmask,但它没有.在调用上述方法之后,fgmask变量将包含"掩码的轮廓".那真是怪了.我想要的只是一个填充白色的简单封闭区域(例如)来表示移动的物体.我怎么能这样做?

任何回复或建议将非常感谢.非常感谢.

这是我的代码:

int main(int argc, char *argv[])
{
    cv::BackgroundSubtractorMOG2 bg = BackgroundSubtractorMOG2(30,16.0,false);
    cv::VideoCapture cap(0);
    cv::Mat frame, mask, _frame, _fmask;
    cvNamedWindow("mask", CV_WINDOW_AUTOSIZE);
    for(;;)
    {
        cap >> frame;
        bg(frame,fmask,-1);

        _frame = IplImage(frame);
        _fmask = IplImage(fmask);

        cvShowImage("mask", &_fmask);
        if(cv::waitKey(30) >= 0) break;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出视频的快照是: 在此输入图像描述

ps我的工作环境是OSX 10.8上的OpenCV2.4.3和带有Apple LLVM编译器4.1的XCode 4.5.2.

sam*_*m18 8

如果你想获得前景中填充了白色像素的整个物体,那么我会请你告诉我一些你的经历.

我的问题是,对于上面提到的代码,当你在相机前产生更多动作时,你会得到更多的白色像素吗?

如果是,则有两个参数可供您了解.

首先是History参数.你在构造函数BackgroundSubtractorMOG2中配置为30 (30,16.0,false); .您可以通过incresing测试此参数,比如说300.它将保持对象在前景中的运动历史.因此,如果您已经完全从300帧内的起始位置移动,那么您可以根据需要获得覆盖有白色像素的整个对象.但它会逐渐被抹去.所以它不能给你100%的解决方案.

第二个参数称为学习率.在你提到的代码中bg(frame,fmask,-1); 其中-1是你的学习率.您可以将其设置为0.0到1.0,默认值为-1.当您将其设置为0时,您将获得所需的对象,这些对象不是视频开头的帧的一部分.你可以将这种对象称为"异物".您将获得覆盖有白色像素的异物.

从我上面提到的信息中探索您的测试并分享您的经验.