首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MoG2中禁用阴影检测

如何在MoG2中禁用阴影检测
EN

Stack Overflow用户
提问于 2016-04-23 19:01:08
回答 2查看 2.5K关注 0票数 1

我使用C++和Opencv 2.3.1来做背景差分。我已经多次尝试更改Mog2的参数,以禁用阴影检测功能,我也尝试了其他人在互联网上的建议。但是,阴影检测仍处于启用状态。

你能告诉我怎么禁用它吗?请参阅示例代码和生成的掩码。

代码语言:javascript
复制
  //opencv
#include < opencv2/opencv.hpp>
#include < opencv2/core/core.hpp>
#include < opencv2/highgui/highgui.hpp>
#include < opencv2/video/background_segm.hpp>
#include < opencv2/imgproc/imgproc.hpp>
#include < opencv2/video/video.hpp>

//C
 #include <stdio.h>
 //C++
#include <iostream>
#include <sstream>

using namespace cv;
using namespace std;

// Global variables
Mat frame; //current frame
Mat fgMaskMOG2; //fg mask fg mask generated by MOG method
Ptr<BackgroundSubtractor> 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
   << "This program shows how to use background subtraction methods provided   by "  << endl
  << " OpenCV. You can process  images (-img)."                                     << endl                                                                      
    << "Usage:"                                                                     << endl
   << "./bs -img <image filename>}"                                                << endl
   << "for example: ./bs -img /data/images/1.png"                                  << endl
   << endl;
  }

// morphological operation

void morphOps(Mat &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 <<"Incorret input list" << endl;
    cerr <<"exiting..." << 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 <<"Please, check the input parameters." << endl;
    cerr <<"Exiting..." << 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 << "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
     pMOG2->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 >> 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 << (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 << "Unable to open image frame: " << nextFrameFilename << 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 << "Unable to save " << imageToSave << endl;
       }
}
}

}

EN

回答 2

Stack Overflow用户

发布于 2016-04-23 19:36:05

看一看the documentation

在你的代码中,你有

代码语言:javascript
复制
bool bShadowDetection = true;

将其更改为

代码语言:javascript
复制
bool bShadowDetection = false;

编辑: OpenCV 3的BackgroundSubtractorMOG2类有设置阴影灰度值的setShadowValue (int value)函数。将灰度值设置为零将移除阴影。

票数 1
EN

Stack Overflow用户

发布于 2017-08-03 21:37:48

这取决于你真正想看到的是什么-如果你想把阴影从分割中分离出来:

bool bShadowDetection = true;并在MOG2->apply()之后使用cv::threshold(Mask,Mask,254,255,cv::THRESH_BINARY);

您将在您的图像中准确地看到{255}的部分

为复活这一切而痛哭。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36809940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档