OpenCV 4.11.0
开源计算机视觉库
加载中...
搜索中...
无匹配项
背景减除

目标

本章中,

  • 我们将熟悉 OpenCV 中可用的背景减除方法。

基础知识

背景减除是许多基于视觉的应用中的一个主要预处理步骤。例如,考虑访客计数器的情况,其中静态摄像头记录进出房间的访客人数,或者交通摄像头提取有关车辆的信息等。在所有这些情况下,首先需要单独提取人员或车辆。从技术上讲,需要从静态背景中提取移动的前景。

如果你只有背景图像,例如没有访客的房间图像、没有车辆的道路图像等,这是一个简单的任务。只需从背景图像中减去新图像即可。你将得到单独的前景对象。但在大多数情况下,你可能没有这样的图像,因此我们需要从现有的图像中提取背景。当存在车辆的阴影时,情况会变得更加复杂。由于阴影也会移动,简单的减法也会将其标记为前景。这会使事情复杂化。

为此目的引入了多种算法。在下文中,我们将研究 `bgsegm` 模块中的两种算法。

BackgroundSubtractorMOG

这是一种基于高斯混合的背景/前景分割算法。它由 P. KadewTraKuPong 和 R. Bowden 于 2001 年在论文“An improved adaptive background mixture model for real-time tracking with shadow detection”中提出。它使用一种方法通过 K 个高斯分布 (K = 3 到 5) 对每个背景像素进行建模。混合的权重表示这些颜色停留在场景中的时间比例。可能的背景颜色是那些停留时间更长且更静态的颜色。

在编码过程中,我们需要使用函数 **cv.bgsegm.createBackgroundSubtractorMOG()** 创建背景对象。它有一些可选参数,例如历史长度、高斯混合的数量、阈值等。所有参数都设置为一些默认值。然后在视频循环内,使用 backgroundsubtractor.apply() 方法获取前景掩码。

请看下面的一个简单示例

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while(1)
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
cv.imshow('frame',fgmask)
k = cv.waitKey(30) & 0xff
if k == 27
break
cap.release()
用于从视频文件、图像序列或摄像头捕获视频的类。
**定义:** videoio.hpp:766
Ptr< BackgroundSubtractorMOG > createBackgroundSubtractorMOG(int history=200, int nmixtures=5, double backgroundRatio=0.7, double noiseSigma=0)
创建高斯混合背景减除器。
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
void destroyAllWindows()
销毁所有 HighGUI 窗口。

(所有结果最终将显示出来进行比较)。

注意
关于较新方法 **cv.createBackgroundSubtractorMOG2()** 的文档可以在这里找到:如何使用背景减除方法

BackgroundSubtractorGMG

该算法结合了统计背景图像估计和逐像素贝叶斯分割。它由 Andrew B. Godbehere、Akihiro Matsukawa 和 Ken Goldberg 在 2012 年的论文“Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation”中提出。根据论文,该系统成功运行了一个名为“Are We There Yet?”的互动音频艺术装置,时间为 2011 年 3 月 31 日至 7 月 31 日,地点是加利福尼亚州旧金山的当代犹太博物馆。

它使用前几帧(默认为 120 帧)进行背景建模。它采用概率前景分割算法,使用贝叶斯推理识别可能的前景对象。估计值是自适应的;较新的观察值比旧的观察值权重更大,以适应变化的光照条件。进行了一些形态学滤波操作,例如闭运算和开运算,以去除不需要的噪声。在前几帧中,你将看到一个黑色窗口。

最好对结果应用形态学开运算以去除噪声。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(3,3))
while(1)
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
fgmask = cv.morphologyEx(fgmask, cv.MORPH_OPEN, kernel)
cv.imshow('frame',fgmask)
k = cv.waitKey(30) & 0xff
if k == 27
break
cap.release()
Ptr< BackgroundSubtractorGMG > createBackgroundSubtractorGMG(int initializationFrames=120, double decisionThreshold=0.8)
创建一个 GMG 背景减除器。
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue())
执行高级形态变换。
Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))
返回用于形态学运算的指定大小和形状的结构元素。

结果

原始帧

下图显示视频的第 200 帧

图像

BackgroundSubtractorMOG 的结果

图像

BackgroundSubtractorGMG 的结果

使用形态学开运算去除噪声。

图像

附加资源

练习