1.knn = cv2.createBackgroundSubtractorKNN(detectShadows=True):knn背景分割
mog=cv2.createBackgroundSubtractorMOG2():MOG背景分割
detectShadows = True表示执行分割,否则表示不执行分割
例子:
import cv2
cap = cv2.VideoCapture('traffic.flv')
knn = cv2.createBackgroundSubtractorKNN(detectShadows=True)
while True :
ret, frame = cap.read() # 读取视频
fgmask = knn.apply(frame) # 背景分割
cv2.imshow('frame', fgmask) # 显示分割结果
if cv2.waitKey(100) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
2.例子:运动检测
import cv2 as cv
cap = cv2.VideoCapture('traffic.flv')
knn= cv2.createBackgroundSubtractorKNN(detectShadows=True)
while True :
ret, frame = cap.read()
fgmask = knn.apply(frame) # 分割背景
# 阈值化,将非纯白色(244~255)的所有像素设为0
th = cv2.threshold(fgmask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
# 为了使效果更好,进行一次膨胀
dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)), iterations=2)
# 检测轮廓
image, contours, hier = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
for c in contours:
if cv2.contourArea(c) > 1600:
(x,y,w,h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0), 2)
cv2.imshow('detection', frame)
if cv2.waitKey(100) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()