Python+OpenCV学习(16)---视频流背景剔除

利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,可以设置断点调试,有助于我这类初学者理解掌握。


在视频监控中,需要捕捉动态目标,那么就需要从视频流中剔除背景,P.KadewTraKuPong 和R.Bowden 在2001 年提出一种利用混合高斯模型对背景像素建模的方法,通过背景像素值持续时间的长短来剔除静止的背景,从而提取视频中的动态目标。


下面是利用python语言结合OpenCV进行背景剔除的代码:

# -*- coding:utf-8 -*-
__author__ = 'Microcosm'

import cv2
import numpy as np

cap = cv2.VideoCapture("E:/python/Python Project/opencv_showimage/videos/viptraffic_long.avi")
#cap = cv2.VideoCapture("E:/python/Python Project/opencv_showimage/videos/vipmen.avi")

# 方法一:
fgbg1 = cv2.BackgroundSubtractorMOG()

# 方法二:
fgbg2 = cv2.BackgroundSubtractorMOG2()

# 方法三:  需要OpenCV3.0
#kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
#fgbg3 = cv2.BackgroundSubtractorGMG()

while(1):
    ret, frame = cap.read()
    if ret:
        fg_mask1 = fgbg1.apply(frame)
        fg_mask2 = fgbg2.apply(frame)

        #fgmask3 = fgbg3.apply(frame)
        #fgmask3 = cv2.morphologyEx(fgmask3, cv2.MORPH_OPEN, kernel)

        result = np.hstack((fg_mask1, fg_mask2))
        cv2.imshow('frame', result)

        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()


测试视频是matlab toolbox vision 目录下的“viptraffic.avi",下面是视频中的截图:

Python+OpenCV学习(16)---视频流背景剔除_第1张图片

方法二是以2004年和2006年Z.Zivkovic 的两篇文章为基础的。方法一(左)和方法二(右)的效果图如下:

Python+OpenCV学习(16)---视频流背景剔除_第2张图片

Python+OpenCV学习(16)---视频流背景剔除_第3张图片

Python+OpenCV学习(16)---视频流背景剔除_第4张图片

Python+OpenCV学习(16)---视频流背景剔除_第5张图片

从上述几帧图像可以看出,方法二的噪声很大,但目标的完整性好

你可能感兴趣的:(OpenCV)