《OpenCV 计算机视觉》—— 视频背景建模
import cv2
cap = cv2.VideoCapture('test.avi')
"""
getstructuringElement(shape,ksize,anchor=None)得到一个卷积核。主要用于后续的腐蚀、膨胀、开、闭等运算。
参数:shape:设定卷积核的形状,可选如下三个参数:
①:MORPH_RECT(矩形卷积核)
②:MORPH_CROSS(十字形卷积核)
③:MORPH ELLIPSE(椭圆形卷积核)
ksize:设定卷积核的大小、
anchor:表示描点的位置:一般c=1,表示描点位于中心
"""
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
# 创建混合高斯模型,用于背景建模
fgbg = cv2.createBackgroundSubtractorMOG2()
while (True):
ret, frame = cap.read() # ret:True表示正常读取到图像,frame:从视频中获取当前一帧图片
cv2.imshow('frame', frame)
fgmask = fgbg.apply(frame) # 视频处理
cv2.imshow('fgmask', fgmask)
fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel) # 开运算去噪点,先腐蚀后膨胀。
cv2.imshow('fgmask_new', fgmask_new)
# 寻找视频中行走人的轮廓
_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
# 计算各轮廓的周长
perimeter = cv2.arcLength(c, True)
if perimeter > 188: # 找到人的矩形框
x, y, w, h = cv2.boundingRect(c)
# 画出这个短形
fgmask_new_rect = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('fgmask_new_rect', fgmask_new_rect)
k = cv2.waitKey(60)
if k == 27:
break