diff --git a/modules/video/src/bgfg_gaussmix2.cpp b/modules/video/src/bgfg_gaussmix2.cpp index ebe449825c..977a2581f3 100644 --- a/modules/video/src/bgfg_gaussmix2.cpp +++ b/modules/video/src/bgfg_gaussmix2.cpp @@ -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 >(row, col) = Vec(meanVal * invWeight); meanVal = 0.f;