Background subtraction - OpenCV - GeeksforGeeks

19 Feb, 2020
Background subtraction is a way of eliminating the background from image. To achieve this we extract the moving foreground from the static background.
Background Subtraction has several use cases in everyday life, It is being used for object segmentation, security enhancement, pedestrian tracking, counting the number of visitors, number of vehicles in traffic etc. It is able to learn and identify the foreground mask.
In OpenCV we have 3 algorithms to do this operation –
BackgroundSubtractorMOG – It is a Gaussian Mixture-based Background/Foreground Segmentation Algorithm.
BackgroundSubtractorMOG2 – It is also a Gaussian Mixture-based Background/Foreground Segmentation Algorithm. It provides better adaptability to varying scenes due illumination changes etc.
BackgroundSubtractorGMG – This algorithm combines statistical background image estimation and per-pixel Bayesian segmentation.
How to apply OpenCV in-built functions for background subtraction –Step #1 – Create an object to signify the algorithm we are using for background subtraction.Step #2 – Apply backgroundsubtractor.apply() function on image.
# importing librariesimport numpy as npimport cv2  # creating objectfgbg1 = cv2.bgsegm.createBackgroundSubtractorMOG();   fgbg2 = cv2.createBackgroundSubtractorMOG2();fgbg3 = cv2.bgsegm.createBackgroundSubtractorGMG();  # capture frames from a camera cap = cv2.VideoCapture(0);while(1):    # read frames    ret, img = cap.read();          # apply mask for background subtraction    fgmask1 = fgbg1.apply(img);    fgmask2 = fgbg2.apply(img);    fgmask3 = fgbg3.apply(img);          cv2.imshow('Original', img);    cv2.imshow('MOG', fgmask1);    cv2.imshow('MOG2', fgmask2);    cv2.imshow('GMG', fgmask3);    k = cv2.waitKey(30) & 0xff;    if k == 27:        break;  cap.release();cv2.destroyAllWindows();
Output:
 
We can see that there is a lot of noise in the resultant image for BackgroundSubtractorGMG, hence it is always preferred to use morphological transformation to the result to remove the noises.
# importing librariesimport numpy as npimport cv2  kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3));  # creating objectfgbg = cv2.bgsegm.createBackgroundSubtractorGMG();  # capture frames from a camera cap = cv2.VideoCapture(0);while(1):    # read frames    ret, img = cap.read();          # apply mask for background subtraction    fgmask = fgbg.apply(img);          # with noise frame    cv2.imshow('GMG noise', fgmask);          # apply transformation to remove noise    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel);          # after removing noise    cv2.imshow('GMG', fgmask);          k = cv2.waitKey(30) & 0xff;    if k == 27:        break;  cap.release();cv2.destroyAllWindows();
Output:
Image-Processing
OpenCV
Python-OpenCV
Technical Scripter 2019
Python
Technical Scripter
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python Dictionary
Read a file line by line in Python
How to Install PIP on Windows ?
Enumerate() in Python
Different ways to create Pandas Dataframe
Iterate over a list in Python
Python String | replace()
Reading and Writing to text files in Python
*args and **kwargs in Python
Create a Pandas DataFrame from Lists