Skip to content
Snippets Groups Projects
Select Git revision
  • 4888e575d47a05b44cae77040573a3cc82526327
  • master default
  • backup
  • cositas_nuevas
  • communication
  • ENTREGA
  • V1.0
  • V0.1
8 results

SubsBackground.cpp

Blame
  • SubsBackground.cpp 6.32 KiB
    /**
     * @file bg_sub.cpp
     * @brief Background subtraction tutorial sample code
     * @author Domenico D. Bloisi
     */
    
    //opencv
    #include <opencv2/core/core.hpp>
    #include <opencv2/opencv.hpp>
    #include <opencv/cv.h>
    #include <opencv2/highgui/highgui.hpp>
    //#include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/video/background_segm.hpp>
    //C
    #include <stdio.h>
    //C++
    #include <iostream>
    #include <sstream>
    
    using namespace cv;
    using namespace std;
    
    // Global variables
    Mat frame; //current frame
    Mat fgMaskMOG; //fg mask generated by MOG method
    Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
    Ptr<BackgroundSubtractorMOG> pMOG; //MOG Background subtractor
    Ptr<BackgroundSubtractorMOG2> pMOG2; //MOG2 Background subtractor
    Mat morphKernel;
    int keyboard; //input from keyboard
    
    /** Function Headers */
    void help();
    void processVideo(char* videoFilename);
    void processImages(char* firstFrameFilename);
    
    void help()
    {
        cout
        << "--------------------------------------------------------------------------" << endl
        << "This program shows how to use background subtraction methods provided by "  << endl
        << " OpenCV. You can process both videos (-vid) and images (-img)."             << endl
                                                                                        << endl
        << "Usage:"                                                                     << endl
        << "./bs {-vid <video filename>|-img <image filename>}"                         << endl
        << "for example: ./bs -vid video.avi"                                           << endl
        << "or: ./bs -img /data/images/1.png"                                           << endl
        << "--------------------------------------------------------------------------" << endl
        << endl;
    }
    
    /**
     * @function main
     */
    int main(int argc, char* argv[])
    {
        //print help information
        help();
    
        //check for the input parameter correctness
        if(argc != 3) {
            cerr <<"Incorret input list" << endl;
            cerr <<"exiting..." << endl;
            return EXIT_FAILURE;
        }
    
        //create GUI windows
        namedWindow("Frame");
        namedWindow("FG Mask MOG");
        namedWindow("FG Mask MOG 2");
    
        //create Background Subtractor objects
    //    pMOG= new BackgroundSubtractorMOG(200,5,0.7,0); //MOG approach
        pMOG= new BackgroundSubtractorMOG(); //MOG approach
        pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach
    //    pMOG = createBackgroundSubtractorMOG(); //MOG approach
    //    pMOG2 = createBackgroundSubtractorMOG2(); //MOG2 approach
    
        morphKernel = getStructuringElement(CV_SHAPE_RECT, Size(3, 3), Point(1, 1));
    
        if(strcmp(argv[1], "-vid") == 0) {
            //input data coming from a video
            processVideo(argv[2]);
        }
        else {
            //error in reading input parameters
            cerr <<"Please, check the input parameters." << endl;
            cerr <<"Exiting..." << endl;
            return EXIT_FAILURE;
        }
        //destroy GUI windows
        destroyAllWindows();
        return EXIT_SUCCESS;
    }
    
    /**
     * @function processVideo
     */
    void processVideo(char* videoFilename) {
        int estadoANTERIOR = 0;
        int estadoACTUAL = 0;
        //create the capture object
        VideoCapture capture(videoFilename);
        if(!capture.isOpened()){
            //error in opening the video input
            cerr << "Unable to open video file: " << videoFilename << endl;
            exit(EXIT_FAILURE);
        }
    
        while( (char)keyboard != 'p' ){
            //read the current frame
            if(!capture.read(frame)) {
                cerr << "Unable to read next frame." << endl;
                cerr << "Exiting..." << endl;
                exit(EXIT_FAILURE);
            }
            imshow("Frame", frame);
            keyboard = waitKey( 30 );
        }
    
        //read input data. ESC or 'q' for quitting
        while( (char)keyboard != 'q' && (char)keyboard != 27 ){
    
            if ((char)keyboard == 's'){
                pMOG= new BackgroundSubtractorMOG(); //MOG approach
                pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach
            }
            //read the current frame
            if(!capture.read(frame)) {
                cerr << "Unable to read next frame." << endl;
                cerr << "Exiting..." << endl;
                exit(EXIT_FAILURE);
            }
            //update the background model
            pMOG->operator()(frame, fgMaskMOG,0);
            pMOG2->operator()(frame, fgMaskMOG2,0);
            erode(fgMaskMOG2, fgMaskMOG2, morphKernel);
    
    		cv::threshold(fgMaskMOG2, fgMaskMOG2, 200, 255, THRESH_BINARY);
    
    		Scalar suma = cv::sum(fgMaskMOG2);
    
    //        cerr << suma.val[0] << endl;
    
    		if (suma.val[0] > 1000000){
                    // estado oclusion
                estadoANTERIOR = estadoACTUAL;
                estadoACTUAL = 1;
                cerr << "MANO !!!\n";
                rectangle(frame, cv::Point(10, 2), cv::Point(100,20),cv::Scalar(255,255,255), -1);
                putText(frame, "MANO !!!", cv::Point(15, 15),FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));
            } else {
                estadoANTERIOR = estadoACTUAL;
                if (estadoANTERIOR == 1){
                    // estado transicion
                    estadoACTUAL = 3;
                }
                if (estadoANTERIOR == 3){
                    // estado estable
                    estadoACTUAL = 2;
                    pMOG= new BackgroundSubtractorMOG(); //MOG approach
                    pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach
                }
                cerr << "ESTABLE !!!\n";
                rectangle(frame, cv::Point(10, 2), cv::Point(100,20),cv::Scalar(255,255,255), -1);
                putText(frame, "ESTABLE !!!", cv::Point(15, 15),FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));
            }
    
    //        dilate(fgMaskMOG, fgMaskMOG, morphKernel, 1);
    //        pMOG->apply(frame, fgMaskMOG);
    //        pMOG2->apply(frame, fgMaskMOG2);
    
    
            //get the frame number and write it on the current frame
    /*
            stringstream ss;
            rectangle(frame, cv::Point(10, 2), cv::Point(100,20),
                      cv::Scalar(255,255,255), -1);
            ss << capture.get(CAP_PROP_POS_FRAMES);
            string frameNumberString = ss.str();
            putText(frame, frameNumberString.c_str(), cv::Point(15, 15),
                    FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));
    */
    
            //show the current frame and the fg masks
            imshow("Frame", frame);
            imshow("FG Mask MOG", fgMaskMOG);
            imshow("FG Mask MOG 2", fgMaskMOG2);
            //get the input from the keyboard
            keyboard = waitKey( 30 );
        }
        //delete capture object
        capture.release();
    }