首先效果图:

语言:python + OpenCV
简单的背景减差算法实现移动物体检测。
学习目标:
1. 理解背景减差算法
2. OpenCV图像滤波
3. 通过连通区域检测目标

前景 = 当前帧 - 背景
但在某些情况下,我们不能得到静态帧,因为光可以改变,或者一些物体会被某人移动,或者总是存在运动,等等。在这种情况下,我们保存了一些帧,并试图找出其中大多数像素是相同的,然后这个像素变为背景的一部分。一般来说,我们如何得到这个背景,以及我们用来选择更合适的滤波器。
在这个例子中,我们使用MOG(混合高斯)进行背景减差,效果:

可以看出一些噪声,和阴影,我们使用标准的滤波器去移除他们。
import os
import logging
import logging.handlers
import random
import numpy as np
import skvideo.io
import cv2
import matplotlib.pyplot as plt
import utils
# without this some strange errors happen
cv2.ocl.setUseOpenCL(False)
random.seed(123)
# ============================================================================
IMAGE_DIR = "./out"
VIDEO_SOURCE = "input.mp4"
SHAPE = (720, 1280) # HxW
# ============================================================================
def train_bg_subtractor(inst, cap, num=500):
'''
BG substractor need process some amount of frames to start giving result
'''
print ('Training BG Subtractor...')
i = 0
for frame in cap:
inst.apply(frame, None, 0.001)
i += 1
if i >= num:
return cap
def main():
log = logging.getLogger("main")
# creting MOG bg subtractor with 500 frames in cache
# and shadow detction
bg_subtractor = cv2.createBackgroundSubtractorMOG2(
history=500, detectShadows=True)
# Set up image source
# You can use also CV2, for some reason it not working for me
cap = skvideo.io.vreader(VIDEO_SOURCE)
# skipping 500 frames to train bg subtractor
train_bg_subtractor(bg_subtractor, cap, num=500)
frame_number = -1
for frame in cap:
if not frame.any():
log.error("Frame capture failed, stopping...")
break
frame_number += 1
utils.save_frame(frame, "./out/frame_%04d.png" % frame_number)
fg_mask = bg_subtractor.apply(frame, None, 0.001)
utils.save_frame(frame, "./out/fg_mask_%04d.png" % frame_number)
# ============================================================================
if __name__ == "__main__":
log = utils.init_logging()
if not os.path.exists(IMAGE_DIR):

最低0.47元/天 解锁文章
4552





