基于背景建模和FasterR-CNN的视频前景和目标检测
首先, 将相邻帧图像对应像素值相减得到差分图像,然后对差分图像二值化,在环境亮度变 化不大的情况下,如果对应像素值变化小于事先确定的阂值时,可以认为此处为背景 像素,如果图像区域的像素值变化很大,则认为这是由于图像中运动物体引起的,将 这些区域标记为前景像素,利用标记的像素区域可以确定运动目标在图像中的位置。回归算法在背景估计中无需维持保存背景估计帧的缓冲区,它们是通过回归的方式基于输入的每一帧图
目 录
摘 要 1
1 理论基础 3
1.1 基于背景建模的视频目标检测 3
1.1.1 帧差法 3
1.1.2 背景减除法 3
1.1.3 高斯混合模型(GMM) 4
1.1.4 基于 VIBE 的背景建模 4
1.1.5 光流法 4
1.2 基于深度学习的目标检测 5
1.2.1 Two Stage 目标检测算法 5
1.2.2 One Stage 目标检测算法 6
2 实验操作及结果 6
2.1 基于背景建模的前景检测 8
2.1.1 帧差法 8
2.1.2 中值滤波 8
2.1.3 高斯混合模型 8
2.2 基于 Faster R-CNN 的目标检测 9
3 实验总结 10
参考文献 11
1 理论基础
1.1基于背景建模的视频目标检测
运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像中提取 出来。 通常情况下,目标分类、跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域,因此运动目标的正确检测与分割对于后期处理非常重要。然而, 由于场景的动态变化,如天气、光照、阴影及杂乱背景干扰等的影响,使得运动目标 的检测与分割变得相当困难。根据摄像头是否保持静止,运动检测分为静态背景和运 动背景两类。大多数视频监控系统是摄像头固定的,因此静态背景下运动目标检测算 法受到广泛关注,常用的方法有帧差法、背景减除法、混合高斯模型、光流法等。
1.1.1帧差法
帧差法是最为常用的运动目标检测和分割方法之一,基本原理是在图像序列相邻 两帧或三帧间采用基于像素的时间差分通过阈值化来提取出图像中的运动区域。首先, 将相邻帧图像对应像素值相减得到差分图像,然后对差分图像二值化,在环境亮度变 化不大的情况下,如果对应像素值变化小于事先确定的阂值时,可以认为此处为背景 像素,如果图像区域的像素值变化很大,则认为这是由于图像中运动物体引起的,将 这些区域标记为前景像素,利用标记的像素区域可以确定运动目标在图像中的位置。 由于相邻两帧间的时间间隔非常短,用前一帧图像作为当前帧的背景模型具有较好的 实时性,其背景不积累,且更新速度快、算法简单、计算量小。算法的不足在于对环 境噪声较为敏感,阈值的选择相当关键,选择过低不足以抑制图像中的噪声,过高则 忽略了图像中有用的变化。本文转载自http://www.biyezuopin.vip/onews.asp?id=15260对于比较大的、颜色一致的运动目标,有可能在目标内部 产生空洞,无法完整地提取运动目标。
1.1.2背景减除法
背景减除法是一种有效的运动对象检测算法,基本思想是利用背景的参数模型来近似背景图像的像素值,将当前帧与背景图像进行差分比较实现对运动区域的检测, 其中区别较大的像素区域被认为是运动区域,而区别较小的像素区域被认为是背景区域。 背景减除法必须要有背景图像,并且背景图像必须是随着光照或外部环境的变化而实时更新的,因此背景减除法的关键是背景建模及其更新。针对如何建立对于不同场景的动态变化均具有自适应性的背景模型,减少动态场景变化对运动分割的影响, 研究人员已提出了许多背景建模算法,但总的来讲可以概括为非回归递推和回归递推两类。 非回归背景建模算法是动态的利用从某一时刻开始到当前一段时间内存储的新近观测数据作为样本来进行背景建模。非回归背景建模方法有最简单的帧间差分、中值滤波方法。回归算法在背景估计中无需维持保存背景估计帧的缓冲区,它们是通过回归的方式基于输入的每一帧图像来更新某个时刻的背景模型,这类方法包括广泛应用的线性卡尔曼滤波法、混合高斯模型等。
import numpy as np
import cv2
# opencv的版本需要为2或3,opencv 4版本会在image, cnts, hierarchy = cv2.findContours()处报错
cap = cv2.VideoCapture(0) # 打开摄像头
#cap = cv2.VideoCapture("F:/SJTU_VideoAnalysis/Project1/Input/demo.avi")
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
mog = cv2.createBackgroundSubtractorMOG2() # 定义高斯混合模型对象 mog
#fourcc1 = cv2.VideoWriter_fourcc(*'XVID')
#fourcc2 = cv2.VideoWriter_fourcc(*'XVID')
#out_detect = cv2.VideoWriter('output_detect.avi', fourcc1, 20.0, size)
#out_bg = cv2.VideoWriter('output_bg.avi', fourcc1, 20.0, size)
i = 0
while (1): # 摄像头正常,进入循环体,读取摄像头每一帧图像
ret, frame = cap.read() # 读取摄像头每一帧图像,frame是这一帧的图像
print(frame.shape)
fgmask = mog.apply(frame) # 使用前面定义的高斯混合模型对象 mog 当前帧的运动目标检测,返回二值图像
gray_frame = fgmask.copy()
# 使用 findContours 检测图像轮廓框,具体原理有论文,但不建议阅读。会使用即可。
# 返回值:image,轮廓图像,不常用。 cnts,轮廓的坐标。 hierarchy,各个框之间父子关系,不常用。
image, cnts, hierarchy = cv2.findContours(gray_frame, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制每一个 cnts 框到原始图像 frame 中
for c in cnts:
if cv2.contourArea(c) < 900: # 计算候选框的面积,如果小于1500,跳过当前候选框
continue
(x, y, w, h) = cv2.boundingRect(c) # 根据轮廓c,得到当前最佳矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2) # 将该矩形框画在当前帧 frame 上
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 255, 255), 2) # 将该矩形框画在当前帧 frame 上
cv2.imshow("Origin", frame) # 显示当前帧
cv2.imshow("GMM", image) # 显示运动前景图像
image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
# print(image.shape)
# print(frame.shape)
#out_detect.write(frame)
#out_bg.write(image)
cv2.waitKey(20)
i = i + 1
cap.release() # 释放候选框
out_detect.release()
out_bg.release()
cv2.destroyAllWindows()
更多推荐
所有评论(0)