背景建模技术可以从静止的背景中提取出移动的前景。背景建模的方法有很多,本文使用的是混合高斯模型。
**完整代码:https://github.com/YvanYan/image_processing/tree/master/bgfd
**
流程:
1.读取视频图像
2.创建混合高斯模型
3.逐帧进行检测
import cv2
cap = cv2.VideoCapture('test.avi')
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
fgbg = cv2.createBackgroundSubtractorMOG2()
while (True):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
cnts = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
for c in cnts:
perimeter = cv2.arcLength(c, True)
if perimeter > 188:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('frame', frame)
cv2.imshow('fgmask', fgmask)
k = cv2.waitKey(150)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
- VideoCapture函数为读取视频,若VideoCapture(0)表示打开笔记本的内置摄像头。
- cap.read()是按帧读取视频,返回值ret表示如果读取帧正确,则返回True,否则读取到文件结尾为False。frame是读取每一帧的图像,是一个三维矩阵。
- createBackgroundSubtractorMOG2创建混合高斯模型用于背景建模。
- fgbg.apply()具有三个输入参数(image,fmask, rate)。image为输入的源图,即为视频的每一帧frame。fmask为前景图。rate为学习率,值为[0,1],为0时表示背景不更新,为1时表示逐帧更新。默认为-1,即为算法自动更新。
- k==27表示当按下退出键后,终止程序。