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; }..
Hi. how do you measure the size of roi? what software did you used to get the coordinate of roi?
ReplyDeleteHi. how do you measure the size of roi? what software did you used to get the coordinate of roi?
ReplyDeleteNice work! This sample code (and links) were quite helpful for helping me understand background subtraction. One question: what is the purpose of the "LearningTime" variable? Why is it capped at 300 / who decided that the limit is 300? What is so significant about the first 300 frames?
ReplyDeleteGood work. Can you have this code into python language? Can be improuve your code for optimization over sized data and speed?
ReplyDeletegood evening sir , I use QtCreator with openCv3.1.0 . when I execute your code it crashes . then I realized that it is the instruction MOG2- > apply ( RoiFrame , Mog_Mask ) ; that crashes the program and when I put this statement in any comment on. Excuse me sir can you give me an idea ??
ReplyDeletewonderful task
ReplyDelete