3

我想掩盖视频中的移动物体。我发现 OpenCV 有一些内置的 BackgroundSubtractors,这可能会节省我很多时间。但是,根据官方参考,功能:

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;
}

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

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

4

1 回答 1

8

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

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

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

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

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

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

于 2012-12-18T05:31:00.340 回答