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),
double maxVal_;
double minVal_;
- size_t frameNum_;
+ int frameNum_;
};
void GMG_LoopBody::operator() (const cv::Range& range) const
bool isForeground = false;
- if (frameNum_ > numInitializationFrames_)
+ if (frameNum_ >= numInitializationFrames_)
{
// typical operation
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);
}
}
}