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