Open In App

Python | Background subtraction using OpenCV

Last Updated : 11 Aug, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Imagine you’re watching CCTV footage and want to track only moving people or cars not the walls, buildings or parked vehicles. This is where Background Subtraction comes in.

Background Subtraction is a computer vision technique used to separate moving objects (foreground) from static scenes (background) in a video. The result is usually a binary mask (black-and-white image) that highlights moving parts.

Use Case of Background Subtraction

  • Pedestrian Tracking: Detect and count people in surveillance footage.
  • Vehicle Counting: Monitor traffic and detect moving vehicles.
  • Security Enhancement: Detect intrusions or unusual movements.
  • Visitor Counting: Track the number of visitors entering/exiting an area.

Shadows of moving objects can also move and sometimes algorithm mistakenly marks them as part of the foreground. Some background subtraction methods handle shadows better than others.

  • BackgroundSubtractorMOG: Gaussian mixture-based model for background segmentation.
  • BackgroundSubtractorMOG2: Improved version with better adaptability to changing lighting and shadow detection.
  • Geometric Multigrid: Uses statistical and per-pixel Bayesian segmentation.

Example

It demonstrates background subtraction using OpenCV’s MOG2 algorithm. It reads a video, applies background subtraction to separate moving objects (foreground) from background and displays both original video and processed mask in real time.

Python
import numpy as np
import cv2

# Load video file
cap = cv2.VideoCapture('/home/sourabh/Downloads/people-walking.mp4')

# Create background subtractor (MOG2 handles shadows well)
fgbg = cv2.createBackgroundSubtractorMOG2()

while True:
    ret, frame = cap.read()
    if not ret:
        break  # Stop if video ends

    # Apply background subtraction
    fgmask = fgbg.apply(frame)

    # Show original and foreground mask side by side
    cv2.imshow('Original Frame', frame)
    cv2.imshow('Foreground Mask', fgmask)

    # Press 'Esc' to exit
    if cv2.waitKey(30) & 0xFF == 27:
        break

# Release resources
cap.release()
cv2.destroyAllWindows()

Original Frame: 

Foreground Mask: 

Explanation:

  • cv2.VideoCapture(): Opens the video file.
  • cv2.createBackgroundSubtractorMOG2(): Creates background subtraction model.
  • fgbg.apply(frame): Subtracts the background and returns binary mask.
  • cv2.imshow(): Displays both original and processed frames in real-time.

Practice Tags :

Similar Reads