From ec99f96c6253240b10335ebcdc4018950df1bc20 Mon Sep 17 00:00:00 2001
From: Pierre-Emmanuel Viel
Date: Wed, 21 May 2014 13:16:12 +0200
Subject: [PATCH] Add the ensureSimpleDistance() method to ensure the user the
returned distance is not ^2 (the default for L2 for instance)
---
modules/flann/include/opencv2/flann/dist.h | 60 ++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/modules/flann/include/opencv2/flann/dist.h b/modules/flann/include/opencv2/flann/dist.h
index 2afceb8893..88f9abc305 100644
--- a/modules/flann/include/opencv2/flann/dist.h
+++ b/modules/flann/include/opencv2/flann/dist.h
@@ -872,6 +872,66 @@ typename Distance::ResultType ensureSquareDistance( typename Distance::ResultTyp
return dummy( dist );
}
+
+/*
+ * ...and a template to ensure the user that he will process the normal distance,
+ * and not squared distance, without loosing processing time calling sqrt(ensureSquareDistance)
+ * that will result in doing actually sqrt(dist*dist) for L1 distance for instance.
+ */
+template
+struct simpleDistance
+{
+ typedef typename Distance::ResultType ResultType;
+ ResultType operator()( ResultType dist ) { return dist; }
+};
+
+
+template
+struct simpleDistance, ElementType>
+{
+ typedef typename L2_Simple::ResultType ResultType;
+ ResultType operator()( ResultType dist ) { return sqrt(dist); }
+};
+
+template
+struct simpleDistance, ElementType>
+{
+ typedef typename L2::ResultType ResultType;
+ ResultType operator()( ResultType dist ) { return sqrt(dist); }
+};
+
+
+template
+struct simpleDistance, ElementType>
+{
+ typedef typename MinkowskiDistance::ResultType ResultType;
+ ResultType operator()( ResultType dist ) { return sqrt(dist); }
+};
+
+template
+struct simpleDistance, ElementType>
+{
+ typedef typename HellingerDistance::ResultType ResultType;
+ ResultType operator()( ResultType dist ) { return sqrt(dist); }
+};
+
+template
+struct simpleDistance, ElementType>
+{
+ typedef typename ChiSquareDistance::ResultType ResultType;
+ ResultType operator()( ResultType dist ) { return sqrt(dist); }
+};
+
+
+template
+typename Distance::ResultType ensureSimpleDistance( typename Distance::ResultType dist )
+{
+ typedef typename Distance::ElementType ElementType;
+
+ simpleDistance dummy;
+ return dummy( dist );
+}
+
}
#endif //OPENCV_FLANN_DIST_H_