优点:
实时性
缺点:
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()