2016-04-23 7 views
0

Ich verwende C++ und Opencv 2.3.1 für Hintergrundsubtraktion. Ich habe viele Male versucht, die Parameter von Mog2 zu ändern, um Schattenerkennungsfunktion zu deaktivieren, auch ich habe versucht, was andere Leute im Internet vorschlagen. Die Schattenerkennung ist jedoch weiterhin aktiviert.So deaktivieren Sie die Schattenerkennung in MoG2

können Sie mir bitte sagen, wie Sie es deaktivieren? siehe den Beispielcode und die generierte Maske.

//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; 
     } 
} 
} 

enter image description here}

Antwort

1

einen Blick auf the documentation

auf dem Code, den Sie

bool bShadowDetection = true; 

Änderung es

bool bShadowDetection = false; 

EDIT haben: 0.123.OpenCV 3's BackgroundSubtractorMOG2 Klasse hat setShadowValue (int value) Funktion, um den Grauwert des Schattens einzustellen. Wenn Sie den Grauwert auf Null setzen, wird der Schatten entfernt.

+0

Wenn i s tun o die Maske generiert einen 256 Graustufen Schatten werfen es deaktivieren, es sei denn, es gibt noch etwas zu ändern. – Zakarya

+0

sind Sie bereit, Schatten (graue Fläche) zu entfernen. dann sollte dein Fragetitel nicht sein ", wie Schattendetektion zu deaktivieren" – sturkmen

+0

ich redigierte die Antwort. OpenCV 3 hat eine Option zum Entfernen von Schatten. aber ich weiß übrigens nicht über 2.4 – sturkmen

0

es hängt davon ab, was Sie wirklich sehen wollen - wenn Sie den Schatten von Ihrer Segmentierung trennen wollen:

bool bShadowDetection = true; und cv::threshold(Mask,Mask,254,255,cv::THRESH_BINARY); nach MOG2->apply()

verwenden werden, erhalten Sie genau der Teil von wich ist {255} in Ihrem Bild

und sry dies für reanimating ...

Verwandte Themen