Here is your answer.
I hope this posting & source code help to you.
And This page also is good explain to use background subtraction.
http://docs.opencv.org/master/d1/dc5/tutorial_background_subtraction.html#gsc.tab=0
This is simple code for example background subtraction.
The input is cam video.
Before get video frame, source code set some options.
MOG2, ROI, and morphology
in while, blur is option for reduce noise,
And morphology is also option.
As your project purpose and camera environment, you add more pre-processing.
But I don't add labeling code, normally do labeling processing after background subtration, because blob selecting(valid size or not), blob counting, interpretation of blob.
More information
Background subtraction code.
http://study.marearts.com/search/label/Background%20subtraction
Morphology
http://study.marearts.com/search/label/Morphology
Labeling (findContours)http://study.marearts.com/search/label/Blob%20labeling
Thank you.
#include "opencv2/opencv.hpp" using namespace cv; int main(int, char) { VideoCapture cap(0); // open the default camera if (!cap.isOpened()) // check if we succeeded return -1; Ptr< BackgroundSubtractorMOG2 > MOG2 = createBackgroundSubtractorMOG2(3000, 64); //Options //MOG2->setHistory(3000); //MOG2->setVarThreshold(128); //MOG2->setDetectShadows(1); //shadow detection on/off Mat Mog_Mask; Mat Mog_Mask_morpho; Rect roi(100, 100, 300, 300); namedWindow("Origin", 1); namedWindow("ROI", 1); Mat frame; Mat RoiFrame; Mat BackImg; int LearningTime=0; //300; Mat element; element = getStructuringElement(MORPH_RECT, Size(9, 9), Point(4, 4)); for (;;) { cap >> frame; // get a new frame from camera if (frame.empty()) break; //option blur(frame(roi), RoiFrame, Size(3, 3)); //RoiFrame = frame(roi); //Mog processing MOG2->apply(RoiFrame, Mog_Mask); if (LearningTime < 300) { LearningTime++; printf("background learning %d \n", LearningTime); } else LearningTime = 301; //Background Imge get MOG2->getBackgroundImage(BackImg); //morphology morphologyEx(Mog_Mask, Mog_Mask_morpho, CV_MOP_DILATE, element); //Binary threshold(Mog_Mask_morpho, Mog_Mask_morpho, 128, 255, CV_THRESH_BINARY); imshow("Origin", frame); imshow("ROI", RoiFrame); imshow("MogMask", Mog_Mask); imshow("BackImg", BackImg); imshow("Morpho", Mog_Mask_morpho); if (waitKey(30) >= 0) break; } return 0; }..