diff --git a/samples/SubsBackground.cpp b/samples/SubsBackground.cpp
index c91cd63e76ebef0f603e72ab1a1b3fa52ace93a3..999950d2b40bcc104dd4a0ea57ebc78acdde206b 100644
--- a/samples/SubsBackground.cpp
+++ b/samples/SubsBackground.cpp
@@ -6,7 +6,10 @@
 
 //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>
@@ -21,8 +24,9 @@ using namespace std;
 Mat frame; //current frame
 Mat fgMaskMOG; //fg mask generated by MOG method
 Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
-Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
-Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor
+Ptr<BackgroundSubtractorMOG> pMOG; //MOG Background subtractor
+Ptr<BackgroundSubtractorMOG2> pMOG2; //MOG2 Background subtractor
+Mat morphKernel;
 int keyboard; //input from keyboard
 
 /** Function Headers */
@@ -66,19 +70,18 @@ int main(int argc, char* argv[])
     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 if(strcmp(argv[1], "-img") == 0) {
-        //input data coming from a sequence of images
-        processImages(argv[2]);
-    }
     else {
         //error in reading input parameters
         cerr <<"Please, check the input parameters." << endl;
@@ -94,6 +97,8 @@ int main(int argc, char* argv[])
  * @function processVideo
  */
 void processVideo(char* videoFilename) {
+    int estadoANTERIOR = 0;
+    int estadoACTUAL = 0;
     //create the capture object
     VideoCapture capture(videoFilename);
     if(!capture.isOpened()){
@@ -101,8 +106,25 @@ void processVideo(char* videoFilename) {
         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;
@@ -110,12 +132,46 @@ void processVideo(char* videoFilename) {
             exit(EXIT_FAILURE);
         }
         //update the background model
-        pMOG->operator()(frame, fgMaskMOG);
-        pMOG2->operator()(frame, fgMaskMOG2);
+        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
 
+
+        //get the frame number and write it on the current frame
 /*
         stringstream ss;
         rectangle(frame, cv::Point(10, 2), cv::Point(100,20),
@@ -136,87 +192,3 @@ void processVideo(char* videoFilename) {
     //delete capture object
     capture.release();
 }
-
-/**
- * @function processImages
- */
-void processImages(char* fistFrameFilename) {
-    //read the first file of the sequence
-    frame = imread(fistFrameFilename);
-    if(!frame.data){
-        //error in opening the first image
-        cerr << "Unable to open first image frame: " << fistFrameFilename << endl;
-        exit(EXIT_FAILURE);
-    }
-    //current image filename
-    string fn(fistFrameFilename);
-    //read input data. ESC or 'q' for quitting
-    while( (char)keyboard != 'q' && (char)keyboard != 27 ){
-        //update the background model
-        pMOG->operator()(frame, fgMaskMOG);
-        pMOG2->operator()(frame, fgMaskMOG2);
-//        pMOG->apply(frame, fgMaskMOG);
-//        pMOG2->apply(frame, fgMaskMOG2);
-        //get the frame number and write it on the current frame
-        size_t index = fn.find_last_of("/");
-        if(index == string::npos) {
-            index = fn.find_last_of("\\");
-        }
-        size_t index2 = fn.find_last_of(".");
-        string prefix = fn.substr(0,index+1);
-        string suffix = fn.substr(index2);
-        string frameNumberString = fn.substr(index+1, index2-index-1);
-        istringstream iss(frameNumberString);
-        int frameNumber = 0;
-        iss >> frameNumber;
-        rectangle(frame, cv::Point(10, 2), cv::Point(100,20),
-                  cv::Scalar(255,255,255), -1);
-        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 );
-        //search for the next image in the sequence
-        ostringstream oss;
-        oss << (frameNumber + 1);
-        string nextFrameNumberString = oss.str();
-        string nextFrameFilename = prefix + nextFrameNumberString + suffix;
-        //read the next frame
-        frame = imread(nextFrameFilename);
-        if(!frame.data){
-            //error in opening the next image in the sequence
-            cerr << "Unable to open image frame: " << nextFrameFilename << endl;
-            exit(EXIT_FAILURE);
-        }
-        //update the path of the current frame
-        fn.assign(nextFrameFilename);
-    }
-}
-
-
-/*#include <opencv2/highgui/highgui.hpp>
-#include <iostream>
-
-using namespace cv;
-using namespace std;
-
-
-int main( int argc, char** argv ) {
-    cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE );
-    CvCapture* capture = cvCreateFileCapture(argv[1]);
-    IplImage* frame;
-    while(1) {
-        frame = cvQueryFrame(capture);
-        if(!frame) break;
-        cvShowImage("Example2", frame );
-        char c = cvWaitKey(33);
-        if(c == 27) break;
-    }
-    cvReleaseCapture(&capture);
-    cvDestroyWindow("Example2");
-    return 0;
-}
-*/