From 167eb072b40cc6b7da92f5a7a735c8326cbc3b79 Mon Sep 17 00:00:00 2001 From: Scott Klum Date: Thu, 2 Apr 2015 10:54:49 -0400 Subject: [PATCH] Added support for multiple histograms --- openbr/plugins/distance/emd.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/openbr/plugins/distance/emd.cpp b/openbr/plugins/distance/emd.cpp index 71e99b4..29a5c95 100644 --- a/openbr/plugins/distance/emd.cpp +++ b/openbr/plugins/distance/emd.cpp @@ -8,9 +8,8 @@ namespace br /*! * \ingroup distances - * \brief Fuses similarity scores across multiple matrices of compared templates + * \brief Computes Earth Mover Distance * \author Scott Klum \cite sklum - * \note Operation: Mean, sum, min, max are supported. */ class EMDDistance : public UntrainableDistance { @@ -18,17 +17,26 @@ class EMDDistance : public UntrainableDistance float compare(const Template &a, const Template &b) const { - Mat sig_a(a.m().cols, 2, CV_32FC1); - Mat sig_b(b.m().cols, 2, CV_32FC1); - - for (int i=0; i(i,0) = a.m().at(0,i); - sig_a.at(i,1) = i; + const int dims_a = a.m().rows > 1 ? 3 : 2; + const int dims_b = b.m().rows > 1 ? 3 : 2; + + Mat sig_a(a.m().cols, dims_a, CV_32FC1); + Mat sig_b(b.m().cols, dims_b, CV_32FC1); + + for (int i=0; i(i*a.m().cols+j,0) = a.m().at(i,j); + sig_a.at(i*a.m().cols+j,1) = j; + if (dims_a == 3) sig_a.at(i*a.m().cols+j,2) = i; + } } - for (int i=0; i(i,0) = b.m().at(0,i); - sig_b.at(i,1) = i; + for (int i=0; i(i*b.m().cols+j,0) = b.m().at(i,j); + sig_b.at(i*b.m().cols+j,1) = j; + if (dims_b == 3) sig_a.at(i*b.m().cols+j,2) = i; + } } return EMD(sig_a,sig_b,CV_DIST_L2); -- libgit2 0.21.4