fixed number of training mode operation
authorVladislav Vinogradov <vlad.vinogradov@itseez.com>
Thu, 9 Aug 2012 08:37:35 +0000 (12:37 +0400)
committerVladislav Vinogradov <vlad.vinogradov@itseez.com>
Thu, 9 Aug 2012 08:37:35 +0000 (12:37 +0400)
modules/video/src/bgfg_gmg.cpp

index f75dc9b..f97207f 100644 (file)
@@ -199,7 +199,7 @@ namespace
     public:
         GMG_LoopBody(const cv::Mat& frame, const cv::Mat& fgmask, const cv::Mat_<int>& nfeatures, const cv::Mat_<int>& colors, const cv::Mat_<float>& weights,
                      int maxFeatures, double learningRate, int numInitializationFrames, int quantizationLevels, double backgroundPrior, double decisionThreshold,
-                     double maxVal, double minVal, size_t frameNum) :
+                     double maxVal, double minVal, int frameNum) :
             frame_(frame), fgmask_(fgmask), nfeatures_(nfeatures), colors_(colors), weights_(weights),
             maxFeatures_(maxFeatures), learningRate_(learningRate), numInitializationFrames_(numInitializationFrames),
             quantizationLevels_(quantizationLevels), backgroundPrior_(backgroundPrior), decisionThreshold_(decisionThreshold),
@@ -227,7 +227,7 @@ namespace
 
         double maxVal_;
         double minVal_;
-        size_t frameNum_;
+        int frameNum_;
     };
 
     void GMG_LoopBody::operator() (const cv::Range& range) const
@@ -262,7 +262,7 @@ namespace
 
                 bool isForeground = false;
 
-                if (frameNum_ > numInitializationFrames_)
+                if (frameNum_ >= numInitializationFrames_)
                 {
                     // typical operation
 
@@ -272,33 +272,31 @@ namespace
                     const double posterior = (weight * backgroundPrior_) / (weight * backgroundPrior_ + (1.0 - weight) * (1.0 - backgroundPrior_));
 
                     isForeground = ((1.0 - posterior) > decisionThreshold_);
-                }
 
-                fgmask_row[x] = (uchar)(-isForeground);
+                    // update histogram.
 
-                if (frameNum_ <= numInitializationFrames_ + 1)
-                {
-                    // training-mode update
+                    for (int i = 0; i < nfeatures; ++i)
+                        weights[i] *= 1.0f - learningRate_;
 
-                    insertFeature(newFeatureColor, 1.0f, colors, weights, nfeatures, maxFeatures_);
+                    bool inserted = insertFeature(newFeatureColor, learningRate_, colors, weights, nfeatures, maxFeatures_);
 
-                    if (frameNum_ == numInitializationFrames_ + 1)
+                    if (inserted)
+                    {
                         normalizeHistogram(weights, nfeatures);
+                        nfeatures_row[x] = nfeatures;
+                    }
                 }
                 else
                 {
-                    // update histogram.
-
-                    for (int i = 0; i < nfeatures; ++i)
-                        weights[i] *= 1.0f - learningRate_;
+                    // training-mode update
 
-                    bool inserted = insertFeature(newFeatureColor, learningRate_, colors, weights, nfeatures, maxFeatures_);
+                    insertFeature(newFeatureColor, 1.0f, colors, weights, nfeatures, maxFeatures_);
 
-                    if (inserted)
+                    if (frameNum_ == numInitializationFrames_ - 1)
                         normalizeHistogram(weights, nfeatures);
                 }
 
-                nfeatures_row[x] = nfeatures;
+                fgmask_row[x] = (uchar)(-isForeground);
             }
         }
     }