diff --git a/openbr/plugins/distance.cpp b/openbr/plugins/distance.cpp index 20da2ea..77c51b7 100644 --- a/openbr/plugins/distance.cpp +++ b/openbr/plugins/distance.cpp @@ -298,7 +298,34 @@ class IdenticalDistance : public Distance BR_REGISTER(Distance, IdenticalDistance) -} // namespace br +/*! + * \ingroup distances + * \brief Online distance metric to attenuate match scores across multiple frames + * \author Brendan klare \cite bklare + */ +class OnlineDistance : public Distance +{ + Q_OBJECT + Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false) + Q_PROPERTY(float alpha READ get_alpha WRITE set_alpha RESET reset_alpha STORED false) + BR_PROPERTY(br::Distance*, distance, NULL) + BR_PROPERTY(float, alpha, 0.1f); + + mutable QHash scoreHash; + mutable QMutex mutex; + + float compare(const Template &target, const Template &query) const + { + float currentScore = distance->compare(target, query); + + QMutexLocker mutexLocker(&mutex); + if (!scoreHash.contains(target.file.name)) scoreHash[target.file.name] = 0.0f; + return (1.0- alpha) * scoreHash[target.file.name] + alpha * currentScore; + } +}; +BR_REGISTER(Distance, OnlineDistance) + +} // namespace br #include "distance.moc"