diff --git a/openbr/plugins/quantize.cpp b/openbr/plugins/quantize.cpp index b16bd0c..fd2880d 100644 --- a/openbr/plugins/quantize.cpp +++ b/openbr/plugins/quantize.cpp @@ -56,6 +56,67 @@ class QuantizeTransform : public Transform BR_REGISTER(Transform, QuantizeTransform) /*! + * \ingroup distances + * \brief Bayesian quantization distance + * \author Josh Klontz \cite jklontz + */ +class BayesianQuantizationDistance : public Distance +{ + Q_OBJECT + QVector loglikelihood; + + void train(const TemplateList &src) + { + if (src.first().size() > 1) + qFatal("Expected sigle matrix templates."); + + Mat data = OpenCVUtils::toMat(src.data()); + QList labels = src.labels(); + + QVector genuines(256*256,0), impostors(256*256,0); + qint64 totalGenuines(0), totalImpostors(0); + for (int i=0; i(256*256); + for (int i=0; i<256*256; i++) + loglikelihood[i] = log((double(genuines[i]+1)/totalGenuines)/(double(impostors[i]+1)/totalImpostors)); + } + + float compare(const Template &a, const Template &b) const + { + const uchar *aData = a.m().data; + const uchar *bData = b.m().data; + const int size = a.m().rows * a.m().cols; + float likelihood = 0; + for (int i=0; i> loglikelihood; + } + + void store(QDataStream &stream) const + { + stream << loglikelihood; + } +}; + +BR_REGISTER(Distance, BayesianQuantizationDistance) + +/*! * \ingroup transforms * \brief Approximate floats as signed bit. * \author Josh Klontz \cite jklontz