使用opencv-python进行背景提取
1. 读取视频文件
video_path = '自己的视频路径,avi格式'
capture = cv2.VideoCapture(video_path)
2. 构造形态学使用的 kernel ,构造高斯混合模型
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
model = cv2.createBackgroundSubtractorMOG2() # history=500, varThreshold=16, detectShadows=True
3. 逐帧读取视频, 同时进行视频帧的对比,使用到 opencv 内置的函数
frameNum = 0
while True:
ret, im0 = capture.read()
# 运用高斯模型进行拟合,在两个标准差内设置为0,在两个标准差外设置为255
fg_mk = model.apply(im0)
ret1, binary_img = cv2.threshold(fg_mk.copy(), 220, 255, cv2.THRESH_BINARY)
# 获取背景
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, se)
bg_image = model.getBackgroundImage()
frameNum += 1
temp_frame = bg_image
# 作帧差 每次与序号整除50的帧作对比
if (frameNum % 50 == 0):
previous_frame = cv2.cvtColor(temp_frame, cv2.COLOR_BGR2GRAY)
# print(previous_frame.shape)
# 500帧之后才进行对比
# 下面这个if语句为测试代码 实际使用的时候需要删掉
if frameNum == 500:
previous_frame = np.random.randint(2555, size=(480, 720))
print(previous_frame.shape)
if (frameNum >= 1000):
currentframe = cv2.cvtColor(temp_frame, cv2.COLOR_BGR2GRAY)
diff_frame = cv2.absdiff(previous_frame, currentframe)
# diff_frame[diff_frame > 0] = 255
# 打印差值
print(cv2.sumElems(currentframe)[0] - cv2.sumElems(previous_frame)[0])
diff = cv2.sumElems(currentframe)[0] - cv2.sumElems(previous_frame)[0]
# 若差值大于自己规定的阈值 那么就会打印信息
if diff > 5000 or diff < -5000:
print("warning !!! The camera is not in the original place !!!")
# 若差值很小 则看起来 diff_frame 就是黑色的 因为大部分差值为0
cv2.imshow('1', diff_frame)
# cv2.imshow('1', bg_image)
cv2.waitKey(1)
capture.release()