From: Vladislav Vinogradov Date: Thu, 9 Aug 2012 10:37:08 +0000 (+0400) Subject: added updateBackgroundModel parameter and release method X-Git-Tag: accepted/2.0/20130307.220821~364^2~272^2~3^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bfd9e6102a8995fd2ada9e5e91c38296fd383667;p=profile%2Fivi%2Fopencv.git added updateBackgroundModel parameter and release method --- diff --git a/modules/video/include/opencv2/video/background_segm.hpp b/modules/video/include/opencv2/video/background_segm.hpp index 791ea1a..9c37ffa 100644 --- a/modules/video/include/opencv2/video/background_segm.hpp +++ b/modules/video/include/opencv2/video/background_segm.hpp @@ -221,6 +221,11 @@ public: */ virtual void operator()(InputArray image, OutputArray fgmask, double learningRate=-1.0); + /** + * Releases all inner buffers. + */ + void release(); + //! Total number of distinct colors to maintain in histogram. int maxFeatures; //! Set between 0.0 and 1.0, determines how quickly features are "forgotten" from histograms. @@ -231,10 +236,12 @@ public: int quantizationLevels; //! Prior probability that any given pixel is a background pixel. A sensitivity parameter. double backgroundPrior; - //! value above which pixel is determined to be FG. + //! Value above which pixel is determined to be FG. double decisionThreshold; - //! smoothing radius, in pixels, for cleaning up FG image. + //! Smoothing radius, in pixels, for cleaning up FG image. int smoothingRadius; + //! Perform background model update + bool updateBackgroundModel; private: double maxVal_; diff --git a/modules/video/src/bgfg_gmg.cpp b/modules/video/src/bgfg_gmg.cpp index f97207f..acec3ed 100644 --- a/modules/video/src/bgfg_gmg.cpp +++ b/modules/video/src/bgfg_gmg.cpp @@ -60,6 +60,7 @@ cv::BackgroundSubtractorGMG::BackgroundSubtractorGMG() backgroundPrior = 0.8; decisionThreshold = 0.8; smoothingRadius = 7; + updateBackgroundModel = true; } cv::BackgroundSubtractorGMG::~BackgroundSubtractorGMG() @@ -199,11 +200,11 @@ namespace public: GMG_LoopBody(const cv::Mat& frame, const cv::Mat& fgmask, const cv::Mat_& nfeatures, const cv::Mat_& colors, const cv::Mat_& weights, int maxFeatures, double learningRate, int numInitializationFrames, int quantizationLevels, double backgroundPrior, double decisionThreshold, - double maxVal, double minVal, int frameNum) : + double maxVal, double minVal, int frameNum, bool updateBackgroundModel) : frame_(frame), fgmask_(fgmask), nfeatures_(nfeatures), colors_(colors), weights_(weights), maxFeatures_(maxFeatures), learningRate_(learningRate), numInitializationFrames_(numInitializationFrames), quantizationLevels_(quantizationLevels), backgroundPrior_(backgroundPrior), decisionThreshold_(decisionThreshold), - maxVal_(maxVal), minVal_(minVal), frameNum_(frameNum) + maxVal_(maxVal), minVal_(minVal), frameNum_(frameNum), updateBackgroundModel_(updateBackgroundModel) { } @@ -224,6 +225,7 @@ namespace int quantizationLevels_; double backgroundPrior_; double decisionThreshold_; + bool updateBackgroundModel_; double maxVal_; double minVal_; @@ -275,18 +277,21 @@ namespace // update histogram. - for (int i = 0; i < nfeatures; ++i) - weights[i] *= 1.0f - learningRate_; + if (updateBackgroundModel_) + { + for (int i = 0; i < nfeatures; ++i) + weights[i] *= 1.0f - learningRate_; - bool inserted = insertFeature(newFeatureColor, learningRate_, colors, weights, nfeatures, maxFeatures_); + bool inserted = insertFeature(newFeatureColor, learningRate_, colors, weights, nfeatures, maxFeatures_); - if (inserted) - { - normalizeHistogram(weights, nfeatures); - nfeatures_row[x] = nfeatures; + if (inserted) + { + normalizeHistogram(weights, nfeatures); + nfeatures_row[x] = nfeatures; + } } } - else + else if (updateBackgroundModel_) { // training-mode update @@ -323,12 +328,25 @@ void cv::BackgroundSubtractorGMG::operator ()(InputArray _frame, OutputArray _fg GMG_LoopBody body(frame, fgmask, nfeatures_, colors_, weights_, maxFeatures, learningRate, numInitializationFrames, quantizationLevels, backgroundPrior, decisionThreshold, - maxVal_, minVal_, frameNum_); + maxVal_, minVal_, frameNum_, updateBackgroundModel); cv::parallel_for_(cv::Range(0, frame.rows), body); - cv::medianBlur(fgmask, buf_, smoothingRadius); - cv::swap(fgmask, buf_); + if (smoothingRadius > 0) + { + cv::medianBlur(fgmask, buf_, smoothingRadius); + cv::swap(fgmask, buf_); + } // keep track of how many frames we have processed ++frameNum_; } + +void cv::BackgroundSubtractorGMG::release() +{ + frameSize_ = cv::Size(); + + nfeatures_.release(); + colors_.release(); + weights_.release(); + buf_.release(); +} diff --git a/modules/video/src/video_init.cpp b/modules/video/src/video_init.cpp index def0cd7..0f3cec1 100644 --- a/modules/video/src/video_init.cpp +++ b/modules/video/src/video_init.cpp @@ -78,7 +78,9 @@ CV_INIT_ALGORITHM(BackgroundSubtractorGMG, "BackgroundSubtractor.GMG", obj.info()->addParam(obj, "smoothingRadius", obj.smoothingRadius,false,0,0, "Radius of smoothing kernel to filter noise from FG mask image."); obj.info()->addParam(obj, "decisionThreshold", obj.decisionThreshold,false,0,0, - "Threshold for FG decision rule. Pixel is FG if posterior probability exceeds threshold.")); + "Threshold for FG decision rule. Pixel is FG if posterior probability exceeds threshold."); + obj.info()->addParam(obj, "updateBackgroundModel", obj.updateBackgroundModel,false,0,0, + "Perform background model update.")); bool initModule_video(void) {