title: How to disable shadow detection in MoG2
body: <p>I am using C++ and Opencv 2.3.1 for background subtraction. I have tried many times to change the parameters of Mog2 in order to disable shadow detection feature also i have tried what other people suggest on the internet. however, the shadow detection still enabled.</p>
  
  <p>could you please tell me how to disable it?
  see the sample code and the generated mask.</p>
  
  <pre><code>  //opencv
  #include &lt; opencv2/opencv.hpp&gt;
  #include &lt; opencv2/core/core.hpp&gt;
  #include &lt; opencv2/highgui/highgui.hpp&gt;
  #include &lt; opencv2/video/background_segm.hpp&gt;
  #include &lt; opencv2/imgproc/imgproc.hpp&gt;
  #include &lt; opencv2/video/video.hpp&gt;
  
  //C
   #include &lt;stdio.h&gt;
   //C++
  #include &lt;iostream&gt;
  #include &lt;sstream&gt;
  
  using namespace cv;
  using namespace std;
  
  // Global variables
  Mat frame; //current frame
  Mat fgMaskMOG2; //fg mask fg mask generated by MOG method
  Ptr&lt;BackgroundSubtractor&gt; pMOG2; //MOG Background subtractor
  int keyboard; //input from keyboard
  
  //new variables
  int history = 1250;
  float varThreshold = 16;
  bool bShadowDetection = true;
  
  /*
  //added to remove the shadow
  unsigned char nShadowDetection = 0;
  float fTau = 0.5;
  //static const unsigned char nShadowDetection =( unsigned char)0;
   */
      // Function Headers 
     void help();
     void processImages(char* firstFrameFilename);
  
   void help()
  {
  cout
     &lt;&lt; "This program shows how to use background subtraction methods provided   by "  &lt;&lt; endl
    &lt;&lt; " OpenCV. You can process  images (-img)."                                     &lt;&lt; endl                                                                      
      &lt;&lt; "Usage:"                                                                     &lt;&lt; endl
     &lt;&lt; "./bs -img &lt;image filename&gt;}"                                                &lt;&lt; endl
     &lt;&lt; "for example: ./bs -img /data/images/1.png"                                  &lt;&lt; endl
     &lt;&lt; endl;
    }
  
  // morphological operation
  
  void morphOps(Mat &amp;thresh){
  
     //create structuring element that will be used to "dilate" and "erode"   image.
     //the element chosen here is a 3px by 3px rectangle
  
     Mat erodeElement = getStructuringElement( MORPH_RECT,Size(2,2)); //3x3
     //dilate with larger element so make sure object is nicely visible
     Mat dilateElement = getStructuringElement( MORPH_RECT,Size(1,1)); //8x8
  
    erode(thresh,thresh,erodeElement);
    erode(thresh,thresh,erodeElement);
  
  
      dilate(thresh,thresh,dilateElement);
      dilate(thresh,thresh,dilateElement);
  
  }
  
  
  // main function
  
  int main(int argc, char* argv[])
  {
  
   //print help information
   help();
  
   //check for the input parameter correctness
   if(argc != 3) {
      cerr &lt;&lt;"Incorret input list" &lt;&lt; endl;
      cerr &lt;&lt;"exiting..." &lt;&lt; endl;
      return EXIT_FAILURE;
   }
  
    //create GUI windows
    namedWindow("Frame");
    namedWindow("FG Mask MOG2 ");
  
   //create Background Subtractor objects
   //pMOG2 = new BackgroundSubtractorMOG2();
    pMOG2 = new BackgroundSubtractorMOG2( history,   varThreshold,     bShadowDetection);
  //BackgroundSubtractorMOG2(int history,  float varThreshold, bool   bShadowDetection=1);
      if(strcmp(argv[1], "-img") == 0) {
      //input data coming from a sequence of images
      processImages(argv[2]);
   }
   else {
      //error in reading input parameters
      cerr &lt;&lt;"Please, check the input parameters." &lt;&lt; endl;
      cerr &lt;&lt;"Exiting..." &lt;&lt; endl;
      return EXIT_FAILURE;
   }
   //destroy GUI windows
   destroyAllWindows();
   return EXIT_SUCCESS;
  }
  
   //function processImages
  
   void processImages(char* fistFrameFilename) {
    //read the first file of the sequence
    frame = imread(fistFrameFilename);
    if(frame.empty()){
       //error in opening the first image
       cerr &lt;&lt; "Unable to open first image frame: " &lt;&lt; fistFrameFilename &lt;&lt;   endl;
       exit(EXIT_FAILURE);
  
   //current image filename
   string fn(fistFrameFilename);
   //read input data. ESC or 'q' for quitting
    while( (char)keyboard != 'q' &amp;&amp; (char)keyboard != 27 ){
       //update the background model
       pMOG2-&gt;operator()(frame, fgMaskMOG2,-1);
       //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 &gt;&gt; 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);
      morphOps(fgMaskMOG2);
      imshow("FG Mask MOG2 ", fgMaskMOG2);
      //get the input from the keyboard
      keyboard = waitKey(1);
      //search for the next image in the sequence
      ostringstream oss;
      oss &lt;&lt; (frameNumber + 1);
      string nextFrameNumberString = oss.str();
      string nextFrameFilename = prefix + nextFrameNumberString + suffix;
      //read the next frame
      frame = imread(nextFrameFilename);
      if(frame.empty()){
          //error in opening the next image in the sequence
          cerr &lt;&lt; "Unable to open image frame: " &lt;&lt; nextFrameFilename &lt;&lt; endl;
          exit(EXIT_FAILURE);
      }
      //update the path of the current frame
      fn.assign(nextFrameFilename);
  
      // save subtracted images
      string imageToSave =("output_MOG_" +  frameNumberString + ".png");
      bool saved = imwrite(  "D:\\SO\\temp\\" +imageToSave,fgMaskMOG2);
      if(!saved) {
      cerr &lt;&lt; "Unable to save " &lt;&lt; imageToSave &lt;&lt; endl;
         }
  }
  }
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/zuGz3.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/zuGz3.png" alt="enter image description here"></a>  }</p>