The process is
resize to small for more fast processing
to blur for avoid noise affection
morphology make blob and remove noise
findContour to draw blob rectangle
Example movie of result.
more detail refer to source code..
#include < stdio.h> #include < iostream> #include < opencv2\opencv.hpp> #include < opencv2/core/core.hpp> #include < opencv2/highgui/highgui.hpp> #include < opencv2/video/background_segm.hpp> #ifdef _DEBUG #pragma comment(lib, "opencv_core247d.lib") #pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing #pragma comment(lib, "opencv_objdetect247d.lib") //HOGDescriptor //#pragma comment(lib, "opencv_gpu247d.lib") //#pragma comment(lib, "opencv_features2d247d.lib") #pragma comment(lib, "opencv_highgui247d.lib") #pragma comment(lib, "opencv_ml247d.lib") //#pragma comment(lib, "opencv_stitching247d.lib"); //#pragma comment(lib, "opencv_nonfree247d.lib"); #pragma comment(lib, "opencv_video247d.lib") #else #pragma comment(lib, "opencv_core247.lib") #pragma comment(lib, "opencv_imgproc247.lib") #pragma comment(lib, "opencv_objdetect247.lib") //#pragma comment(lib, "opencv_gpu247.lib") //#pragma comment(lib, "opencv_features2d247.lib") #pragma comment(lib, "opencv_highgui247.lib") #pragma comment(lib, "opencv_ml247.lib") //#pragma comment(lib, "opencv_stitching247.lib"); //#pragma comment(lib, "opencv_nonfree247.lib"); #pragma comment(lib, "opencv_video247d.lib") #endif using namespace cv; using namespace std; int main() { //global variables Mat frame; //current frame Mat resize_blur_Img; Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method Mat binaryImg; //Mat TestImg; Mat ContourImg; //fg mask fg mask generated by MOG2 method Ptr< BackgroundSubtractor> pMOG2; //MOG2 Background subtractor pMOG2 = new BackgroundSubtractorMOG2(300,32,true);//300,0.0); char fileName[100] = "mm2.avi"; //video\\mm2.avi"; //mm2.avi"; //cctv 2.mov"; //mm2.avi"; //";//_p1.avi"; VideoCapture stream1(fileName); //0 is the id of video device.0 if you have only one camera //morphology element Mat element = getStructuringElement(MORPH_RECT, Size(7, 7), Point(3,3) ); //unconditional loop while (true) { Mat cameraFrame; if(!(stream1.read(frame))) //get one frame form video break; //Resize resize(frame, resize_blur_Img, Size(frame.size().width/3, frame.size().height/3) ); //Blur blur(resize_blur_Img, resize_blur_Img, Size(4,4) ); //Background subtraction pMOG2->operator()(resize_blur_Img, fgMaskMOG2, -1);//,-0.5); /////////////////////////////////////////////////////////////////// //pre procesing //1 point delete //morphologyEx(fgMaskMOG2, fgMaskMOG2, CV_MOP_ERODE, element); morphologyEx(fgMaskMOG2, binaryImg, CV_MOP_CLOSE, element); //morphologyEx(fgMaskMOG2, testImg, CV_MOP_OPEN, element); //Shadow delete //Binary threshold(binaryImg, binaryImg, 128, 255, CV_THRESH_BINARY); //Find contour ContourImg = binaryImg.clone(); //less blob delete vector< vector< Point> > contours; findContours(ContourImg, contours, // a vector of contours CV_RETR_EXTERNAL, // retrieve the external contours CV_CHAIN_APPROX_NONE); // all pixels of each contours vector< Rect > output; vector< vector< Point> >::iterator itc= contours.begin(); while (itc!=contours.end()) { //Create bounding rect of object //rect draw on origin image Rect mr= boundingRect(Mat(*itc)); rectangle(resize_blur_Img, mr, CV_RGB(255,0,0)); ++itc; } /////////////////////////////////////////////////////////////////// //Display imshow("Shadow_Removed", binaryImg); imshow("Blur_Resize", resize_blur_Img); imshow("MOG2", fgMaskMOG2); if (waitKey(5) >= 0) break; } }