openCV简要-07 背景建模

1.帧差法
摄像机静止(如监控)拍摄的视频,关心画面中运动的物体,试图将他们识别出来。第一种方法是帧差法:帧差法
即拿当前帧和前一帧做差取差值,若差值大于某一个数,则将这个像素点判定为是运动的(前景),否则是静止的(背景)
但帧差法会引入噪声和空洞问题。

2.混合高斯模型
对视频中的图像背景用混合高斯模型模拟;当新来的像素点不能满足当前混合高斯模型中所有的分布,则判定为前景,否则判定为背景。
判定标准:新来的像素点的分布均值与GMM中的某个分布的均值做差,若差值大于后者方差的3倍,则认为新来的这个像素点不满足GMM中的这个分布;若GMM中所有的分布都不能满足,则判定为前景。

import cv2
import numpy as np

vc=cv2.VideoCapture('d:\exercise_set\\18_19\\test.avi')
#创建核
kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
#创建混合高斯模型(用于背景建模)
fgbg=cv2.createBackgroundSubtractorMOG2()

while(1):
    ret,frame=vc.read()
    if frame is None :
        print('normal')
        break
    #每一帧都与混合高斯模型中的所有分布对比后的结果
    fgmask=fgbg.apply(frame)
    #用开运算去除噪声点
    fgmask=cv2.morphologyEx(fgmask,cv2.MORPH_OPEN,kernel)
    #寻找轮廓
    im,contours,hierarchy=cv2.findContours(fgmask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    #遍历所有轮廓
    for i in contours:
        #计算轮廓周长
        perimeter=cv2.arcLength(i,True)
        #若周长大于某个合理的值,则认为是运动物体,在帧中用矩形框出来
        if perimeter>188:
            x,y,w,h=cv2.boundingRect(i)
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
    #显示原视频和用混合高斯模型建立的背景
    cv2.imshow('frame',frame)
    cv2.imshow('fgmask',fgmask)
    k=cv2.waitKey(50) & 0xff
    if k==27:
        break
vc.release()
cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/qq_43579980/article/details/113253764