BackgroundSubtractorMOG2的掩码

时间:2012-09-20 03:08:52

标签: opencv background-subtraction mog

如何判断BackgroundSubtractorMOG2哪些像素更新为背景模型以及哪些像素不应该

我遇到问题,当一个物体进入场景并停止了几十秒钟时,物体将被吸收到背景模型中。

我想降低学习率或停止围绕特定停止对象的学习,但我该怎么做? BackgroundSubtractorMOG2是否支持在其更新函数中使用掩码?

我正在使用OpenCV 2.4.1。

谢谢, 阿尔文。

3 个答案:

答案 0 :(得分:4)

BackgroundSubtractorMOG2不支持屏蔽输入。但是,如果您知道要屏蔽哪些像素,则可以屏蔽输出:假设您已调用subtractor(input, fg, learningRate);并且您以某种方式知道对象现在的位置(可能是您使用平均移位或模式跟踪它)识别)只需fg |= mask; mask,{{1}}就在哪里,正如你从一些不同的来源所知,对象是。

答案 1 :(得分:2)

您可以通过将学习率设置得非常低来实现这一目标

即:

mog(input, output, 0.00000001);

答案 2 :(得分:0)

您可以用背景图像替换蒙版部分:

BackgroundSubtractorMOG2 mog_bgs;
.
.
void my_apply(const cv::Mat& img, cv::Mat& fg, const cv::Mat& mask){
  cv::Mat last_bg;
  cv::Mat masked_img = img.clone();
  mog_bgs.getBackgroundImage(last_bg);
  last_bg.copyTo(masked_img, mask);
  mog_bgs.apply(masked_img, fg);
}

或重量遮盖的零件:

BackgroundSubtractorMOG2 mog_bgs;
.
.
void my_apply(const cv::Mat& img, cv::Mat& fg, const cv::Mat& mask){
  cv::Mat last_bg;
  cv::Mat masked_img = img.clone();
  mog_bgs.getBackgroundImage(last_bg);
  masked_img.forEach<Vec3b>([&](Vec3b& p, const int* position) -> void
    {
        if (mask.at<uchar>(position[0], position[1]) > 0) {
            auto b = last_bg.at<Vec3b>(position[0], position[1]);
            p[0] = p[0]*0.2 + b[0]*0.8;
            p[1] = p[1]*0.2 + b[1]*0.8;
            p[2] = p[2]*0.2 + b[2]*0.8;
        }
    });
  mog_bgs.apply(masked_img, fg);
}