OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
如何使用背景减除方法

上一个教程: 高级图像拼接API (Stitcher 类)
下一个教程: 均值漂移和Camshift

原始作者Domenico Daniele Bloisi
兼容性OpenCV >= 3.0
  • 背景减除 (BS) 是一种常用且广泛使用的技术,通过使用静态摄像机生成前景掩码(即,一个包含场景中移动对象像素的二值图像)。
  • 顾名思义,BS 通过对当前帧和背景模型进行减法运算来计算前景掩码,背景模型包含场景的静态部分,或者更普遍地说,根据观察到的场景特征,可以被视为背景的所有内容。
  • 背景建模包括两个主要步骤

    1. 背景初始化;
    2. 背景更新。

    第一步是计算背景的初始模型,而第二步是更新该模型,以适应场景中可能的变化。

  • 在本教程中,我们将学习如何使用 OpenCV 进行背景减除。

目标

在本教程中,您将学习如何

  1. 使用视频或图像序列读取数据,通过使用 cv::VideoCapture
  2. 创建和更新背景模型,通过使用 cv::BackgroundSubtractor 类;
  3. 获取并显示前景掩码,通过使用 cv::imshow

代码

您可以在下面找到源代码。我们将允许用户选择处理视频文件或图像序列。

在此示例中,我们将使用 cv::BackgroundSubtractorMOG2 来生成前景掩码。

结果和输入数据都会显示在屏幕上。

解释

我们讨论上面代码的主要部分

  • 一个 cv::BackgroundSubtractor 对象将用于生成前景掩码。在此示例中,使用了默认参数,但也可以在创建函数中声明特定参数。
  • 一个 cv::VideoCapture 对象用于读取输入视频或输入图像序列。
  • 每一帧都用于计算前景掩码和更新背景。如果要更改用于更新背景模型的学习率,可以通过向 apply 方法传递参数来设置特定的学习率。
  • 当前帧号可以从 cv::VideoCapture 对象中提取,并标记在当前帧的左上角。使用一个白色矩形来突出显示黑色的帧号。
  • 我们准备好显示当前的输入帧和结果。

结果

  • 使用 vtest.avi 视频,对于以下帧

MOG2 方法的程序输出如下所示(灰色区域是检测到的阴影)

KNN 方法的程序输出如下所示(灰色区域是检测到的阴影)

参考文献