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;
}
..
