【问题标题】:How to get moving object's mask using OpenCV BackgroundSubtractorMOG2如何使用 OpenCV BackgroundSubtractorMOG2 获取移动对象的蒙版
【发布时间】:2012-11-16 00:08:35
【问题描述】:

我想从视频中屏蔽移动的物体。 我发现 OpenCV 有一些内置的 BackgroundSubtractors 可以节省我很多时间。但是,根据official reference,函数:

void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)

应该输出一个掩码 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;
}

输出视频的快照是:

附言我的工作环境是 OSX 10.8 上的 OpenCV2.4.3 和带有苹果 LLVM 编译器 4.1 的 XCode 4.5.2。

【问题讨论】:

    标签: object opencv background mask foreground


    【解决方案1】:

    如果您想获取前景中充满白色像素的整个对象,那么我想请您告诉我一些您的经验。

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

    如果是,那么有两个参数需要了解以满足您的要求。

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

    第二个参数称为学习率。在您提到的代码中 bg(frame,fmask,-1); 其中 -1 是您的学习率。您可以将其设置为 0.0 到 1.0,默认值为 -1。当您将其设置为 0 时,您将获得不属于视频开头帧的对象所需的内容。您可以将这种对象称为“外来对象”。你会得到被白色像素覆盖的异物。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多