Object 如何获取移动对象';使用OpenCV BackgroundSubtractorMOG2的s掩码

Object 如何获取移动对象';使用OpenCV BackgroundSubtractorMOG2的s掩码,object,opencv,background,mask,foreground,Object,Opencv,Background,Mask,Foreground,我想屏蔽视频中的移动对象。 我发现OpenCV有一些内置的背景减法器,这可能会节省我很多时间。但是,根据,功能: void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1) 应该输出一个掩码,fgmask,但它没有。调用上述方法后,fgmask变量将包含“掩模轮廓”。真奇怪。我想要的只是一个简单的封闭区域,填充白色(例如)来表示移动的对象。我怎么能

我想屏蔽视频中的移动对象。 我发现OpenCV有一些内置的背景减法器,这可能会节省我很多时间。但是,根据,功能:

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;
}
输出视频的快照为:


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

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

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

如果是,则需要了解两个参数以满足您的需求

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

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

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