diff --git a/openbr/openbr_plugin.cpp b/openbr/openbr_plugin.cpp index 94fc737..6f2717a 100644 --- a/openbr/openbr_plugin.cpp +++ b/openbr/openbr_plugin.cpp @@ -1386,6 +1386,16 @@ QList Distance::compare(const TemplateList &targets, const Template &quer return scores; } +float compare(const Template &a, const Template &b) const +{ + return compare(a.m(), b.m()); +} + +float compare(const cv::Mat &, const cv::Mat &) const +{ + qFatal("Logic error: distance metric did not implement a comparison function or was accessed at an unsupported level of abstraction."); +} + /* Distance - private methods */ void Distance::compareBlock(const TemplateList &target, const TemplateList &query, Output *output, int targetOffset, int queryOffset) const { diff --git a/openbr/openbr_plugin.h b/openbr/openbr_plugin.h index 7c43c39..e17a70c 100644 --- a/openbr/openbr_plugin.h +++ b/openbr/openbr_plugin.h @@ -1324,8 +1324,8 @@ public: virtual void train(const TemplateList &src) { (void) src; } /*!< \brief Train the distance. */ virtual void compare(const TemplateList &target, const TemplateList &query, Output *output) const; /*!< \brief Compare two template lists. */ virtual QList compare(const TemplateList &targets, const Template &query) const; /*!< \brief Compute the normalized distance between a template and a template list. */ - virtual float compare(const Template &a, const Template &b) const { return compare(a.m(), b.m()); } /*!< \brief Compute the distance between two templates. */ - virtual float compare(const cv::Mat &a, const cv::Mat &b) const = 0; + virtual float compare(const Template &a, const Template &b) const; /*!< \brief Compute the distance between two templates. */ + virtual float compare(const cv::Mat &a, const cv::Mat &b) const; /*!< \brief Compute the distance between two biometric signatures. */ protected: inline Distance *make(const QString &description) { return make(description, this); } /*!< \brief Make a subdistance. */ diff --git a/openbr/plugins/distance.cpp b/openbr/plugins/distance.cpp index 2fcf1d5..ca90b3f 100644 --- a/openbr/plugins/distance.cpp +++ b/openbr/plugins/distance.cpp @@ -224,11 +224,6 @@ private: distances[i]->train(partitionedSrc[i]); } - float compare(const Mat &a, const Mat &b) const - { - return distances.first()->compare(a, b); - } - float compare(const Template &a, const Template &b) const { if (a.size() != b.size()) qFatal("Comparison size mismatch"); @@ -237,7 +232,7 @@ private: for (int i=0; icompare(a[i], b[i])); + scores.append(weight*distances[i]->compare(Template(a.file, a[i]),Template(b.file, b[i]))); } switch (operation) { @@ -328,11 +323,6 @@ class NegativeLogPlusOneDistance : public Distance distance->train(src); } - float compare(const cv::Mat &a, const cv::Mat &b) const - { - return compare(Template(a), Template(b)); - } - float compare(const Template &a, const Template &b) const { return -log(distance->compare(a,b)+1); @@ -388,11 +378,6 @@ class OnlineDistance : public Distance mutable QHash scoreHash; mutable QMutex mutex; - float compare(const Mat &a, const Mat &b) const - { - return compare(Template(a), Template(b)); - } - float compare(const Template &target, const Template &query) const { float currentScore = distance->compare(target, query); @@ -415,12 +400,6 @@ class AttributeDistance : public Distance Q_PROPERTY(QString attribute READ get_attribute WRITE set_attribute RESET reset_attribute STORED false) BR_PROPERTY(QString, attribute, QString()) - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error."); - return 0; - } - float compare(const Template &target, const Template &query) const { float queryValue = query.file.get(attribute); @@ -455,11 +434,6 @@ class SumDistance : public Distance futures.waitForFinished(); } - float compare(const Mat &a, const Mat &b) const - { - return compare(Template(a), Template(b)); - } - float compare(const Template &target, const Template &query) const { float result = 0; diff --git a/openbr/plugins/quality.cpp b/openbr/plugins/quality.cpp index d49b766..0e7bc66 100644 --- a/openbr/plugins/quality.cpp +++ b/openbr/plugins/quality.cpp @@ -246,11 +246,6 @@ class ZScoreDistance : public Distance if (stddev == 0) qFatal("Stddev is 0."); } - float compare(const cv::Mat &a, const cv::Mat &b) const - { - return compare(Template(a), Template(b)); - } - float compare(const Template &target, const Template &query) const { float score = distance->compare(target,query); @@ -406,11 +401,6 @@ class UnitDistance : public Distance qDebug("a = %f, b = %f", a, b); } - float compare(const cv::Mat &a, const cv::Mat &b) const - { - return compare(Template(a), Template(b)); - } - float compare(const Template &target, const Template &query) const { return a * (distance->compare(target, query) - b); diff --git a/openbr/plugins/quantize.cpp b/openbr/plugins/quantize.cpp index b541567..3091e09 100644 --- a/openbr/plugins/quantize.cpp +++ b/openbr/plugins/quantize.cpp @@ -257,12 +257,6 @@ class ProductQuantizationDistance : public Distance Q_PROPERTY(bool bayesian READ get_bayesian WRITE set_bayesian RESET reset_bayesian STORED false) BR_PROPERTY(bool, bayesian, false) - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error."); - return 0; - } - float compare(const Template &a, const Template &b) const { float distance = 0; @@ -303,12 +297,6 @@ class RecursiveProductQuantizationDistance : public Distance Q_PROPERTY(float t READ get_t WRITE set_t RESET reset_t STORED false) BR_PROPERTY(float, t, -std::numeric_limits::max()) - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error."); - return 0; - } - float compare(const Template &a, const Template &b) const { return compareRecursive(a, b, 0, a.size(), 0); diff --git a/openbr/plugins/validate.cpp b/openbr/plugins/validate.cpp index 08744ef..75bca83 100644 --- a/openbr/plugins/validate.cpp +++ b/openbr/plugins/validate.cpp @@ -143,12 +143,6 @@ class CrossValidateDistance : public Distance { Q_OBJECT - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error"); - return 0; - } - float compare(const Template &a, const Template &b) const { static const QString key("Partition"); // More efficient to preallocate this @@ -169,12 +163,6 @@ class FilterDistance : public Distance { Q_OBJECT - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error."); - return 0; - } - float compare(const Template &a, const Template &b) const { (void) b; // Query template isn't checked @@ -209,12 +197,6 @@ class MetadataDistance : public Distance Q_PROPERTY(QStringList filters READ get_filters WRITE set_filters RESET reset_filters STORED false) BR_PROPERTY(QStringList, filters, QStringList()) - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error."); - return 0; - } - float compare(const Template &a, const Template &b) const { foreach (const QString &key, filters) { @@ -268,12 +250,6 @@ class RejectDistance : public Distance Q_PROPERTY(bool rejectIfContains READ get_rejectIfContains WRITE set_rejectIfContains RESET reset_rejectIfContains STORED false) BR_PROPERTY(bool, rejectIfContains, false) - float compare(const cv::Mat &, const cv::Mat &) const - { - qFatal("Logic error."); - return 0; - } - float compare(const Template &a, const Template &b) const { // We don't look at the query