Skip to content

Instantly share code, notes, and snippets.

@Zumbalamambo
Forked from TheSalarKhan/backgroundAveraging.py
Created November 7, 2017 09:47
Show Gist options
  • Save Zumbalamambo/b11119826ba56a664dd667e891d42197 to your computer and use it in GitHub Desktop.
Save Zumbalamambo/b11119826ba56a664dd667e891d42197 to your computer and use it in GitHub Desktop.
Background Averaging (Background Subtraction) in Python+OpenCV
import numpy as np
import cv2
class BackGroundSubtractor:
# When constructing background subtractor, we
# take in two arguments:
# 1) alpha: The background learning factor, its value should
# be between 0 and 1. The higher the value, the more quickly
# your program learns the changes in the background. Therefore,
# for a static background use a lower value, like 0.001. But if
# your background has moving trees and stuff, use a higher value,
# maybe start with 0.01.
# 2) firstFrame: This is the first frame from the video/webcam.
def __init__(self,alpha,firstFrame):
self.alpha = alpha
self.backGroundModel = firstFrame
def getForeground(self,frame):
# apply the background averaging formula:
# NEW_BACKGROUND = CURRENT_FRAME * ALPHA + OLD_BACKGROUND * (1 - APLHA)
self.backGroundModel = frame * self.alpha + self.backGroundModel * (1 - self.alpha)
# after the previous operation, the dtype of
# self.backGroundModel will be changed to a float type
# therefore we do not pass it to cv2.absdiff directly,
# instead we acquire a copy of it in the uint8 dtype
# and pass that to absdiff.
return cv2.absdiff(self.backGroundModel.astype(np.uint8),frame)
cam = cv2.VideoCapture(0)
# Just a simple function to perform
# some filtering before any further processing.
def denoise(frame):
frame = cv2.medianBlur(frame,5)
frame = cv2.GaussianBlur(frame,(5,5),0)
return frame
ret,frame = cam.read()
if ret is True:
backSubtractor = BackGroundSubtractor(0.01,denoise(frame))
run = True
else:
run = False
while(run):
# Read a frame from the camera
ret,frame = cam.read()
# If the frame was properly read.
if ret is True:
# Show the filtered image
cv2.imshow('input',denoise(frame))
# get the foreground
foreGround = backSubtractor.getForeground(denoise(frame))
# Apply thresholding on the background and display the resulting mask
ret, mask = cv2.threshold(foreGround, 15, 255, cv2.THRESH_BINARY)
# Note: The mask is displayed as a RGB image, you can
# display a grayscale image by converting 'foreGround' to
# a grayscale before applying the threshold.
cv2.imshow('mask',mask)
key = cv2.waitKey(10) & 0xFF
else:
break
if key == 27:
break
cam.release()
cv2.destroyAllWindows()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment