Skip to content

如何使用背景减除方法

  • 背景减除(Background Subtraction,BS)是一种常用且广泛使用的技术,用于通过静态相机生成前景掩码(即一张包含场景中属于运动目标的像素的二值图像)。

  • 顾名思义,BS 通过在当前帧与背景模型之间执行减除来计算前景掩码,背景模型包含场景的静态部分,或者更一般地,考虑到所观察场景的特征,包含一切可被视为背景的内容。

  • 背景建模包括两个主要步骤:

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

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

  • 在本教程中,我们将学习如何使用 OpenCV 执行 BS。

Background_Subtraction_Tutorial_Scheme.png

在本教程中,你将学习如何:

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

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

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

结果以及输入数据将显示在屏幕上。

  • 可下载代码:点击 这里

  • 代码一览: 代码见下方示例

  • 可下载代码:点击 这里

  • 代码一览: 代码见下方示例

  • 可下载代码:点击 这里

  • 代码一览: 代码见下方示例

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

  • 将使用一个 cv::BackgroundSubtractor 对象来生成前景掩码。在本示例中,使用默认参数,但也可以在 create 函数中声明特定的参数。

  • 使用一个 cv::VideoCapture 对象来读取输入视频或输入图像序列。

  • 每一帧既用于计算前景掩码,也用于更新背景。如果你想更改用于更新背景模型的学习率,可以通过向 apply 方法传递参数来设置特定的学习率。

  • 可以从 cv::VideoCapture 对象中提取当前帧号,并将其盖印在当前帧的左上角。使用一个白色矩形来突出显示黑色的帧号。

  • 我们准备好显示当前输入帧和结果了。

  • 对于 vtest.avi 视频,以下面的帧为例:

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

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

Background_Subtraction_Tutorial_frame.jpg Background_Subtraction_Tutorial_result_MOG2.jpg Background_Subtraction_Tutorial_result_KNN.jpg