背景减除法:
1.GMM MOG2算法,高斯混合模型分离算法,它为每个像素选择适当数量的高斯分布
函数:cv2.createBackgroundSubtractorMOG2(int history=500,double varThread=16,bool detectShadows =true)
2.KNN模型:
cv2.createBackgroundSubtractorKNN()
方法:通过视频中的背景进行建模,实现背景消除,生成mask图像,通过对mask二值图像分析实现对前景活动对象的区域的提取,整个步骤如下:
1初始化背景建模对象GMM
2读取视频一帧
3使用背景建模消除生成mask
4对mask进行轮廓分析提取ROI
5绘制ROI对象
import numpy as np
import cv2
cap = cv2.VideoCapture("anew.flv")
fgbg = cv2.createBackgroundSubtractorMOG2(history=500,varThreshold=100,detectShadows=False)
def getPerson(image,opt=1):
mask = fgbg.apply(image)
line = cv2.getStructuringElement(cv2.MORPH_RECT,(1,5),(-1,-1))
mask = cv2.morphologyEx(mask,cv2.MORPH_OPEN,line)
cv2.imshow("mask",mask)
#opencv版本不同,以下返回的参数个数也不同
contours,hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for c in range(len(contours)):
area = cv2.contourArea(contours[c])
if area < 300:
continue
rect = cv2.minAreaRect(contours[c])
cv2.ellipse(image,rect,(0,255,0),2,8)
cv2.circle(image,(np.int32(rect[0][0]),np.int32(rect[0][1])),2,(255,0,0),2,cv2.LINE_AA)
return image,mask
while True:
ret,frame = cap.read()
result,m_ = getPerson(frame)
cv2.imshow('result',result)
k = cv2.waitKey(20) & 0xff ==ord('q')
if k ==27:
break
cap.release()
cv2.destroyAllWindows()
除了不能关闭窗口,还得强制关停,没毛病。