Commit 167eb072b40cc6b7da92f5a7a735c8326cbc3b79
1 parent
bd8be323
Added support for multiple histograms
Showing
1 changed file
with
19 additions
and
11 deletions
openbr/plugins/distance/emd.cpp
| @@ -8,9 +8,8 @@ namespace br | @@ -8,9 +8,8 @@ namespace br | ||
| 8 | 8 | ||
| 9 | /*! | 9 | /*! |
| 10 | * \ingroup distances | 10 | * \ingroup distances |
| 11 | - * \brief Fuses similarity scores across multiple matrices of compared templates | 11 | + * \brief Computes Earth Mover Distance |
| 12 | * \author Scott Klum \cite sklum | 12 | * \author Scott Klum \cite sklum |
| 13 | - * \note Operation: Mean, sum, min, max are supported. | ||
| 14 | */ | 13 | */ |
| 15 | class EMDDistance : public UntrainableDistance | 14 | class EMDDistance : public UntrainableDistance |
| 16 | { | 15 | { |
| @@ -18,17 +17,26 @@ class EMDDistance : public UntrainableDistance | @@ -18,17 +17,26 @@ class EMDDistance : public UntrainableDistance | ||
| 18 | 17 | ||
| 19 | float compare(const Template &a, const Template &b) const | 18 | float compare(const Template &a, const Template &b) const |
| 20 | { | 19 | { |
| 21 | - Mat sig_a(a.m().cols, 2, CV_32FC1); | ||
| 22 | - Mat sig_b(b.m().cols, 2, CV_32FC1); | ||
| 23 | - | ||
| 24 | - for (int i=0; i<a.m().cols; i++) { | ||
| 25 | - sig_a.at<float>(i,0) = a.m().at<float>(0,i); | ||
| 26 | - sig_a.at<float>(i,1) = i; | 20 | + const int dims_a = a.m().rows > 1 ? 3 : 2; |
| 21 | + const int dims_b = b.m().rows > 1 ? 3 : 2; | ||
| 22 | + | ||
| 23 | + Mat sig_a(a.m().cols, dims_a, CV_32FC1); | ||
| 24 | + Mat sig_b(b.m().cols, dims_b, CV_32FC1); | ||
| 25 | + | ||
| 26 | + for (int i=0; i<a.m().rows; i++) { | ||
| 27 | + for (int j=0; j<a.m().cols; j++) { | ||
| 28 | + sig_a.at<float>(i*a.m().cols+j,0) = a.m().at<float>(i,j); | ||
| 29 | + sig_a.at<float>(i*a.m().cols+j,1) = j; | ||
| 30 | + if (dims_a == 3) sig_a.at<float>(i*a.m().cols+j,2) = i; | ||
| 31 | + } | ||
| 27 | } | 32 | } |
| 28 | 33 | ||
| 29 | - for (int i=0; i<b.m().cols; i++) { | ||
| 30 | - sig_b.at<float>(i,0) = b.m().at<float>(0,i); | ||
| 31 | - sig_b.at<float>(i,1) = i; | 34 | + for (int i=0; i<b.m().rows; i++) { |
| 35 | + for (int j=0; j<b.m().cols; j++) { | ||
| 36 | + sig_b.at<float>(i*b.m().cols+j,0) = b.m().at<float>(i,j); | ||
| 37 | + sig_b.at<float>(i*b.m().cols+j,1) = j; | ||
| 38 | + if (dims_b == 3) sig_a.at<float>(i*b.m().cols+j,2) = i; | ||
| 39 | + } | ||
| 32 | } | 40 | } |
| 33 | 41 | ||
| 34 | return EMD(sig_a,sig_b,CV_DIST_L2); | 42 | return EMD(sig_a,sig_b,CV_DIST_L2); |