运动目标检测OpenCV背景减除法

背景减除法:

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()

除了不能关闭窗口,还得强制关停,没毛病。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值