Merge branch 'master' of https://github.com/MicheleCancilla/opencv into parallel_ccomp
[platform/upstream/opencv.git] / modules / video / src / bgfg_gaussmix2.cpp
index 7a1786c..51ec9f9 100644 (file)
@@ -693,11 +693,16 @@ public:
                 //go through all modes
                 //////
 
-                //renormalize weights
-                totalWeight = 1.f/totalWeight;
+                // Renormalize weights. In the special case that the pixel does
+                // not agree with any modes, set weights to zero (a new mode will be added below).
+                float invWeight = 0.f;
+                if (std::abs(totalWeight) > FLT_EPSILON) {
+                    invWeight = 1.f/totalWeight;
+                }
+
                 for( int mode = 0; mode < nmodes; mode++ )
                 {
-                    gmm[mode].weight *= totalWeight;
+                    gmm[mode].weight *= invWeight;
                 }
 
                 //make new mode if needed and exit
@@ -900,7 +905,10 @@ void BackgroundSubtractorMOG2Impl::getBackgroundImage_intern(OutputArray backgro
                 if(totalWeight > backgroundRatio)
                     break;
             }
-            float invWeight = 1.f/totalWeight;
+            float invWeight = 0.f;
+            if (std::abs(totalWeight) > FLT_EPSILON) {
+                invWeight = 1.f/totalWeight;
+            }
 
             meanBackground.at<Vec<T,CN> >(row, col) = Vec<T,CN>(meanVal * invWeight);
             meanVal = 0.f;