您的位置:首页 > 编程语言 > Python开发

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

2015-09-16 21:37 495 查看
利用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",下面是视频中的截图:



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









从上述几帧图像可以看出,方法二的噪声很大,但目标的完整性好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: