12 单帧差法

优点:

实时性

缺点:

1、运动物体如果过大,且颜色一致,则会造成运动物体中空的现象

2、如果光照变化强烈,也不适合该算法

#!/usr/bin/env python
#coding=utf-8
"""
利用侦差法检测背景   阴影如何处理? 第一帧不能有运动物体?

"""
import cv2
import numpy as np

#1.获取摄像头图像
camera = cv2.VideoCapture('people.avi')

#2. 获取常用的结构元素的形状 椭圆>>长轴为9,短轴为4
#参数介绍MORPH_RECT(矩形), MORPH_ELLIPSE(椭圆),MORPH_CROSS(十字形)
es = cv2.getStructuringElement(cv2.MORPH_CROSS,(9,4))

#3. 定义内核大小及元素
kernel = np.ones((5,5),np.uint8)

background = None

#4. 进入视频流处理
while(True):

    #5. 获取图像
    ret,frame = camera.read()

    # 第一帧作为背景,故不能出现运动的物体
    if background is None:
        #背景灰度化
        background = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        #背景高斯滤波
        background = cv2.GaussianBlur(background,(21,21),0)
        continue

    #灰度化
    gray_fram = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    #高斯模糊
    gray_fram = cv2.GaussianBlur(gray_fram,(21,21),0)


    #10.与背景做侦差(取差值得绝对值)
    diff = cv2.absdiff(background,gray_fram)

    #11. 侦差结果二值化
    diff = cv2.threshold(diff,25,255,cv2.THRESH_BINARY)[1]

    #12. 侦差结果膨胀处理
    diff = cv2.dilate(diff,es,iterations=2)
    #diff = cv2.morphologyEx(diff, cv2.MORPH_, kernel)

    #13.对侦差结果进行找轮廓   白色斑点的轮廓
    image,cnts,hierarchy = cv2.findContours(diff.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    #14.如果轮廓变化大,则画矩形,认为有变化
    for c in cnts:
        if cv2.contourArea(c) < 1500:
            continue
        (x,y,w,h) = cv2.boundingRect(c)  #计算矩形边界框
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)


    cv2.imshow("contours",frame)
    cv2.imshow("diff",diff)
    if cv2.waitKey(100) & 0xff == ord("q"):
        break

cv2.destroyAllWindows()
camera.release()

    

原文地址:https://www.cnblogs.com/venicid/p/8005830.html