如何告诉 BackgroundSubtractorMOG2 哪些像素要更新到背景模型,哪些像素不应该。
当有一个物体进入场景并停止十秒钟时,我面临一个问题,该物体将被吸收到背景模型中。
我想降低学习率或停止围绕特定停止对象的学习,但我该怎么做?BackgroundSubtractorMOG2 是否支持在其更新功能中使用遮罩?
我正在使用 OpenCV 2.4.1。
如何告诉 BackgroundSubtractorMOG2 哪些像素要更新到背景模型,哪些像素不应该。
当有一个物体进入场景并停止十秒钟时,我面临一个问题,该物体将被吸收到背景模型中。
我想降低学习率或停止围绕特定停止对象的学习,但我该怎么做?BackgroundSubtractorMOG2 是否支持在其更新功能中使用遮罩?
我正在使用 OpenCV 2.4.1。
BackgroundSubtractorMOG2
不支持屏蔽输入。但是,如果您知道要屏蔽哪些像素,则可以屏蔽输出:假设您已经调用subtractor(input, fg, learningRate);
并且您以某种方式知道对象现在在哪里(可能是您一直在使用均值偏移或模式识别来跟踪它)只是在fg |= mask;
哪里mask
正如您从一些不同的来源所知道的那样,是对象所在的位置。
您可以通过将学习率设置得非常低来实现这一点
IE:
mog(input, output, 0.00000001);
您可以用背景图像替换蒙面部分:
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);
}