Advertisement
xXLinusXx

Background Substraction OpenCV MOG

Aug 6th, 2014
776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  *http://stackoverflow.com/questions/25161269/background-substraction-using-opencv-mog-from-live-camera-feed/
  3.  */
  4.  
  5. #include <opencv2/opencv.hpp>
  6. #include <opencv2/highgui/highgui.hpp>
  7. #include <time.h>
  8. #include <iostream>
  9. #include <iomanip>
  10.  
  11. using namespace std;
  12. using namespace cv;
  13.  
  14. const static int SENSITIVITY_VALUE = 20;
  15. const static int BLUR_SIZE = 10;
  16.  
  17. bool detectMotion(Mat thresholdImage);
  18. string intToString(int number);
  19. string getDateTimeForFile();
  20. string getDateTime();
  21.  
  22. int main(int argc, char** argv)
  23. {
  24.     initModule_video();
  25.     setUseOptimized(true);
  26.     setNumThreads(4);
  27.  
  28.     VideoCapture cap;
  29.     if (argc > 1)
  30.         cap.open(argv[1]);
  31.     else
  32.         cap.open(0);
  33.     cap.set(CV_CAP_PROP_FOURCC ,CV_FOURCC('D', 'I', 'V', '3') );
  34.  
  35.     if (!cap.isOpened())
  36.     {
  37.         std::cerr << "Cannot read video. Try moving video file to sample directory." << std::endl;
  38.         return -1;
  39.     }
  40.     VideoWriter oVideoWriter;
  41.     double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
  42.     double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
  43.     Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));
  44.  
  45.     std::string l_fname = "";
  46.  
  47.     namedWindow("Image", WINDOW_NORMAL);
  48.     namedWindow("Debug", WINDOW_NORMAL);
  49.  
  50.     Mat frame, fgMaskMOG;
  51.  
  52.     Ptr<BackgroundSubtractor> pMOG = new BackgroundSubtractorMOG();
  53.     for (;;)
  54.     {
  55.         if(!cap.read(frame)) {
  56.             cerr << "Unable to read next frame." << endl;
  57.             continue;
  58.         }
  59.         // process the image to obtain a mask image.
  60.         pMOG->operator()(frame, fgMaskMOG);
  61.  
  62.         std::string time = getDateTime();
  63.         cv::rectangle(frame,cv::Rect(0,cap.get(CV_CAP_PROP_FRAME_HEIGHT)-25,290,20),cv::Scalar(255,255,255),-1);
  64.         cv::putText(frame,time,cv::Point(0,cap.get(CV_CAP_PROP_FRAME_HEIGHT)-5),1,1.5,cv::Scalar(0,0,0),2);
  65.  
  66.         // detect contours in the final threshold image.
  67.         if(false){
  68.             string fname = "C:/Users/Familjen-Styren/Videos/VIDEO" + getDateTimeForFile() + ".avi";
  69.             if(l_fname == "" || l_fname != fname){
  70.                 oVideoWriter  = VideoWriter(fname, CV_FOURCC('D', 'I', 'V', '3'), 10, frameSize, true);
  71.                 if ( !oVideoWriter.isOpened() )
  72.                 {
  73.                     std::cerr <<  "ERROR: Failed to initialize video writing" << std::endl;
  74.                     return -1;
  75.                 }
  76.             }
  77.             l_fname = fname;
  78.             oVideoWriter.write(frame);
  79.             putText(frame,"REC",Point(0,60),2,2,Scalar(0,0,255),2);
  80.         }
  81.         // show image.
  82.         imshow("Image", frame);
  83.         imshow("Debug",fgMaskMOG);
  84.         int c = waitKey(30);
  85.         if (c == 'q' || c == 'Q' || (c & 255) == 27)
  86.             break;
  87.     }
  88.     return 0;
  89. }
  90.  
  91. bool detectMotion(Mat thresholdImage){
  92.     //create motionDetected variable.
  93.     bool motionDetected = false;
  94.     //create temp Mat for threshold image
  95.     Mat temp;
  96.     thresholdImage.copyTo(temp);
  97.     //these two vectors needed for output of findContours
  98.     vector< vector<Point> > contours;
  99.     vector<Vec4i> hierarchy;
  100.     //find contours of filtered image using openCV findContours function
  101.     //findContours(temp,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );// retrieves all contours
  102.     findContours(temp,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE );// retrieves external contours
  103.  
  104.     //if contours vector is not empty, we have found some objects
  105.     //we can simply say that if the vector is not empty, motion in the video feed has been detected.
  106.     if(contours.size()>0)motionDetected=true;
  107.     else motionDetected = false;
  108.  
  109.     return motionDetected;
  110.  
  111. }
  112.  
  113. string intToString(int number){
  114.  
  115.     //this function has a number input and string output
  116.     std::stringstream ss;
  117.     ss << number;
  118.     return ss.str();
  119. }
  120.  
  121. string getDateTime(){
  122.     //get the system time
  123.     time_t theTime = time(NULL);
  124.     struct tm *aTime = localtime(&theTime);
  125.     //create string to store the date and time
  126.     string dateTime;
  127.     //convert year to string
  128.     string year = intToString(aTime->tm_year + 1900);
  129.     //use stringstream to add a leading '0' to the month (ie. 3 -> 03)
  130.     //we use 'setw(2)' so that we force the string 2 characters wide with a zero in front of it.
  131.     //if the month is '10' then it will remain '10'
  132.     std::stringstream m;
  133.     m<<std::setfill('0')<<std::setw(2)<< aTime->tm_mon + 1;
  134.     string month = m.str();
  135.     //day
  136.     std::stringstream d;
  137.     d<<std::setfill('0')<<std::setw(2)<< aTime->tm_mday;
  138.     string day = d.str();
  139.     //hour
  140.     std::stringstream hr;
  141.     hr<<setfill('0')<<std::setw(2)<<aTime->tm_hour;
  142.     string hour = hr.str();
  143.     //minute
  144.     std::stringstream min;
  145.     min<<setfill('0')<<std::setw(2)<<aTime->tm_min;
  146.     string minute = min.str();
  147.     //second
  148.     std::stringstream sec;
  149.     sec<<setfill('0')<<std::setw(2)<<aTime->tm_sec;
  150.     string second = sec.str();
  151.  
  152.     //here we use the year, month, day, hour, minute info to create a custom string
  153.     //this will be displayed in the bottom left corner of our video feed.
  154.     dateTime = year + "-" + month + "-" + day + "  " + hour + ":" + minute + ":" + second;
  155.  
  156.     return dateTime;
  157. }
  158.  
  159. string getDateTimeForFile(){
  160.     //get the system time
  161.     time_t theTime = time(NULL);
  162.     struct tm *aTime = localtime(&theTime);
  163.     //create string to store the date and time
  164.     string dateTime;
  165.     //convert year to string
  166.     string year = intToString(aTime->tm_year + 1900);
  167.     //use stringstream to add a leading '0' to the month (ie. 3 -> 03)
  168.     //we use 'setw(2)' so that we force the string 2 characters wide with a zero in front of it.
  169.     //if the month is '10' then it will remain '10'
  170.     std::stringstream m;
  171.     m<<std::setfill('0')<<std::setw(2)<< aTime->tm_mon + 1;
  172.     string month = m.str();
  173.     //day
  174.     std::stringstream d;
  175.     d<<std::setfill('0')<<std::setw(2)<< aTime->tm_mday;
  176.     string day = d.str();
  177.     //hour
  178.     std::stringstream hr;
  179.     hr<<setfill('0')<<std::setw(2)<<aTime->tm_hour;
  180.     string hour = hr.str();
  181.    
  182.     dateTime = year + "_" + month + "_" + day;
  183.     return dateTime;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement