《OpenCV 计算机视觉》—— 视频背景建模

时间:2024-10-01 08:16:30
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