繁体   English   中英

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

[英]How to get moving object's mask using OpenCV BackgroundSubtractorMOG2

我想屏蔽视频中的移动物体。 我发现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和带有Apple LLVM编译器4.1的XCode 4.5.2。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM