diff --git a/openbr/openbr_plugin.h b/openbr/openbr_plugin.h index cd23aba..7c43c39 100644 --- a/openbr/openbr_plugin.h +++ b/openbr/openbr_plugin.h @@ -1324,7 +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 = 0; /*!< \brief Compute the distance between two templates. */ + 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; 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 ac8c7ee..2fcf1d5 100644 --- a/openbr/plugins/distance.cpp +++ b/openbr/plugins/distance.cpp @@ -58,10 +58,10 @@ private: BR_PROPERTY(Metric, metric, L2) BR_PROPERTY(bool, negLogPlusOne, true) - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { - if ((a.m().size != b.m().size) || - (a.m().type() != b.m().type())) + if ((a.size != b.size) || + (a.type() != b.type())) return -std::numeric_limits::max(); // TODO: this max value is never returned based on the switch / default @@ -90,7 +90,7 @@ private: case Cosine: return cosine(a, b); case Dot: - return a.m().dot(b); + return a.dot(b); default: qFatal("Invalid metric"); } @@ -138,7 +138,7 @@ class DefaultDistance : public Distance distance = Distance::make("Dist("+file.suffix()+")"); } - float compare(const Template &a, const Template &b) const + float compare(const cv::Mat &a, const cv::Mat &b) const { return distance->compare(a, b); } @@ -169,7 +169,7 @@ class PipeDistance : public Distance futures.waitForFinished(); } - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { float result = -std::numeric_limits::max(); foreach (br::Distance *distance, distances) { @@ -224,6 +224,11 @@ 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"); @@ -232,7 +237,7 @@ private: for (int i=0; icompare(Template(a.file, a[i]),Template(b.file, b[i]))); + scores.append(weight*distances[i]->compare(a[i], b[i])); } switch (operation) { @@ -282,9 +287,9 @@ class ByteL1Distance : public Distance { Q_OBJECT - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { - return l1(a.m().data, b.m().data, a.m().total()); + return l1(a.data, b.data, a.total()); } }; @@ -299,9 +304,9 @@ class HalfByteL1Distance : public Distance { Q_OBJECT - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { - return packed_l1(a.m().data, b.m().data, a.m().total()); + return packed_l1(a.data, b.data, a.total()); } }; @@ -323,6 +328,11 @@ 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); @@ -350,21 +360,18 @@ class IdenticalDistance : public Distance { Q_OBJECT - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { - const Mat &am = a.m(); - const Mat &bm = b.m(); - const size_t size = am.total() * am.elemSize(); - if (size != bm.total() * bm.elemSize()) return 0; + const size_t size = a.total() * a.elemSize(); + if (size != b.total() * b.elemSize()) return 0; for (size_t i=0; i 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); @@ -403,6 +415,12 @@ 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); @@ -437,6 +455,11 @@ 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/eigen3.cpp b/openbr/plugins/eigen3.cpp index 4965d2f..45fd671 100644 --- a/openbr/plugins/eigen3.cpp +++ b/openbr/plugins/eigen3.cpp @@ -659,11 +659,11 @@ class L1Distance : public Distance { Q_OBJECT - float compare(const Template &a, const Template &b) const + float compare(const cv::Mat &a, const cv::Mat &b) const { - const int size = a.m().rows * a.m().cols; - Eigen::Map aMap((float*)a.m().data, size); - Eigen::Map bMap((float*)b.m().data, size); + const int size = a.rows * a.cols; + Eigen::Map aMap((float*)a.data, size); + Eigen::Map bMap((float*)b.data, size); return (aMap-bMap).cwiseAbs().sum(); } }; @@ -679,11 +679,11 @@ class L2Distance : public Distance { Q_OBJECT - float compare(const Template &a, const Template &b) const + float compare(const cv::Mat &a, const cv::Mat &b) const { - const int size = a.m().rows * a.m().cols; - Eigen::Map aMap((float*)a.m().data, size); - Eigen::Map bMap((float*)b.m().data, size); + const int size = a.rows * a.cols; + Eigen::Map aMap((float*)a.data, size); + Eigen::Map bMap((float*)b.data, size); return (aMap-bMap).squaredNorm(); } }; diff --git a/openbr/plugins/keypoint.cpp b/openbr/plugins/keypoint.cpp index 60d5f29..abf31fa 100644 --- a/openbr/plugins/keypoint.cpp +++ b/openbr/plugins/keypoint.cpp @@ -126,13 +126,13 @@ class KeyPointMatcherDistance : public Distance qFatal("Failed to create DescriptorMatcher: %s", qPrintable(matcher)); } - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { - if ((a.m().rows < 2) || (b.m().rows < 2)) return 0; + if ((a.rows < 2) || (b.rows < 2)) return 0; std::vector< std::vector > matches; - if (a.m().rows < b.m().rows) descriptorMatcher->knnMatch(a, b, matches, 2); - else descriptorMatcher->knnMatch(b, a, matches, 2); + if (a.rows < b.rows) descriptorMatcher->knnMatch(a, b, matches, 2); + else descriptorMatcher->knnMatch(b, a, matches, 2); QList distances; foreach (const std::vector &match, matches) { diff --git a/openbr/plugins/pp5.cpp b/openbr/plugins/pp5.cpp index 0948901..900decf 100644 --- a/openbr/plugins/pp5.cpp +++ b/openbr/plugins/pp5.cpp @@ -322,7 +322,7 @@ class PP5CompareDistance : public Distance ppr_free_gallery(gallery.gallery); } - float compare(const Template &target, const Template &query) const + float compare(const cv::Mat &target, const cv::Mat &query) const { TemplateList targetList; targetList.append(target); diff --git a/openbr/plugins/quality.cpp b/openbr/plugins/quality.cpp index 0abc8a5..d49b766 100644 --- a/openbr/plugins/quality.cpp +++ b/openbr/plugins/quality.cpp @@ -182,7 +182,7 @@ class MatchProbabilityDistance : public Distance mp = MP(genuineScores, impostorScores); } - float compare(const Template &target, const Template &query) const + float compare(const cv::Mat &target, const cv::Mat &query) const { const float rawScore = distance->compare(target, query); if (rawScore == -std::numeric_limits::max()) return rawScore; @@ -246,6 +246,11 @@ 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); @@ -308,7 +313,7 @@ class HeatMapDistance : public Distance distances[i]->train(patches[i]); } - float compare(const Template &target, const Template &query) const + float compare(const cv::Mat &target, const cv::Mat &query) const { (void) target; (void) query; @@ -401,6 +406,11 @@ 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 e74513f..b541567 100644 --- a/openbr/plugins/quantize.cpp +++ b/openbr/plugins/quantize.cpp @@ -163,11 +163,11 @@ class BayesianQuantizationDistance : public Distance futures.waitForFinished(); } - float compare(const Template &a, const Template &b) const + float compare(const cv::Mat &a, const cv::Mat &b) const { - const uchar *aData = a.m().data; - const uchar *bData = b.m().data; - const int size = a.m().rows * a.m().cols; + const uchar *aData = a.data; + const uchar *bData = b.data; + const int size = a.rows * a.cols; float likelihood = 0; for (int i=0; i::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/sentence.cpp b/openbr/plugins/sentence.cpp index 8f43794..8ecd4ca 100644 --- a/openbr/plugins/sentence.cpp +++ b/openbr/plugins/sentence.cpp @@ -43,12 +43,12 @@ class SentenceSimilarityDistance : public Distance { Q_OBJECT - float compare(const Template &a, const Template &b) const + float compare(const Mat &a, const Mat &b) const { - uchar *aBuffer = a.m().data; - uchar *bBuffer = b.m().data; - const uchar *aEnd = aBuffer + a.m().cols; - const uchar *bEnd = bBuffer + b.m().cols; + uchar *aBuffer = a.data; + uchar *bBuffer = b.data; + const uchar *aEnd = aBuffer + a.cols; + const uchar *bEnd = bBuffer + b.cols; int32_t aWord, bWord, aRows, bRows, aColumns, bColumns; float *aData, *bData; diff --git a/openbr/plugins/svm.cpp b/openbr/plugins/svm.cpp index 826541c..27aecea 100644 --- a/openbr/plugins/svm.cpp +++ b/openbr/plugins/svm.cpp @@ -260,10 +260,10 @@ private: trainSVM(svm, deltaData, deltaLab, kernel, type, -1, -1); } - float compare(const Template &ta, const Template &tb) const + float compare(const Mat &a, const Mat &b) const { Mat delta; - absdiff(ta, tb, delta); + absdiff(a, b, delta); return svm.predict(delta.reshape(1, 1)); } diff --git a/openbr/plugins/validate.cpp b/openbr/plugins/validate.cpp index 75bca83..08744ef 100644 --- a/openbr/plugins/validate.cpp +++ b/openbr/plugins/validate.cpp @@ -143,6 +143,12 @@ 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 @@ -163,6 +169,12 @@ 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 @@ -197,6 +209,12 @@ 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) { @@ -250,6 +268,12 @@ 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