From 4309e06616170ee7ee4da2237ac44ac3898100d3 Mon Sep 17 00:00:00 2001
From: asantamaria <asantamaria@iri.upc.edu>
Date: Thu, 10 Aug 2017 10:45:25 +0200
Subject: [PATCH] added matcher bruteforce l1

---
 src/CMakeLists.txt                            |  7 +-
 src/examples/test_matcher.cpp                 |  5 +-
 src/examples/yaml/BRUTEFORCEL1.yaml           |  5 ++
 .../bruteforce_l1/matcher_bruteforce_l1.cpp   | 17 +++++
 .../bruteforce_l1/matcher_bruteforce_l1.h     | 66 +++++++++++++++++++
 .../matcher_bruteforce_l1_load_yaml.cpp       | 46 +++++++++++++
 6 files changed, 143 insertions(+), 3 deletions(-)
 create mode 100644 src/examples/yaml/BRUTEFORCEL1.yaml
 create mode 100644 src/matchers/bruteforce_l1/matcher_bruteforce_l1.cpp
 create mode 100644 src/matchers/bruteforce_l1/matcher_bruteforce_l1.h
 create mode 100644 src/matchers/bruteforce_l1/matcher_bruteforce_l1_load_yaml.cpp

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f763e2a..77c67d3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -56,7 +56,9 @@ SET(sources
 	matchers/flannbased/matcher_flannbased.cpp
 	matchers/flannbased/matcher_flannbased_load_yaml.cpp
 	matchers/bruteforce/matcher_bruteforce.cpp
-	matchers/bruteforce/matcher_bruteforce_load_yaml.cpp	)
+	matchers/bruteforce/matcher_bruteforce_load_yaml.cpp
+	matchers/bruteforce_l1/matcher_bruteforce_l1.cpp
+	matchers/bruteforce_l1/matcher_bruteforce_l1_load_yaml.cpp)
 
 # application header files
 SET(headers 
@@ -95,7 +97,8 @@ SET(headers
 	matchers/matcher_factory.h
 	matchers/matcher_base.h
 	matchers/flannbased/matcher_flannbased.h
-	matchers/bruteforce/matcher_bruteforce.h)
+	matchers/bruteforce/matcher_bruteforce.h
+	matchers/bruteforce_l1/matcher_bruteforce_l1.h)
 
 # locate the necessary dependencies
 FIND_PACKAGE(Eigen3 REQUIRED)
diff --git a/src/examples/test_matcher.cpp b/src/examples/test_matcher.cpp
index 3ac6eb6..c5e440e 100644
--- a/src/examples/test_matcher.cpp
+++ b/src/examples/test_matcher.cpp
@@ -37,6 +37,7 @@
 // Matchers
 #include "../matchers/flannbased/matcher_flannbased.h"
 #include "../matchers/bruteforce/matcher_bruteforce.h"
+#include "../matchers/bruteforce_l1/matcher_bruteforce_l1.h"
 
 int main(void)
 {
@@ -117,7 +118,7 @@ int main(void)
 
     std::cout << "\n================ MATCHER TEST  =================" << std::endl;
 
-    std::string def_matcher = "BRUTEFORCE";
+    std::string def_matcher = "BRUTEFORCEL1";
     std::cout << std::endl << "Which MATCHER do you want to test? Type one of the registered names  [default: " << def_matcher << "]: ";
     std::string mat_name = readFromUser(def_matcher);
 
@@ -127,6 +128,8 @@ int main(void)
     	mat_ptr = std::static_pointer_cast<MatcherFLANNBASED>(mat_ptr);
     if (mat_name.compare("BRUTEFORCE") == 0)
     	mat_ptr = std::static_pointer_cast<MatcherBRUTEFORCE>(mat_ptr);
+    if (mat_name.compare("BRUTEFORCEL1") == 0)
+    	mat_ptr = std::static_pointer_cast<MatcherBRUTEFORCEL1>(mat_ptr);
 
     std::cout << std::endl << "... Testing " << det_ptr->getName() << " with " <<  des_ptr->getName() << " and " <<  mat_ptr->getName() << " ..." << std::endl;
 
diff --git a/src/examples/yaml/BRUTEFORCEL1.yaml b/src/examples/yaml/BRUTEFORCEL1.yaml
new file mode 100644
index 0000000..1aa9b5d
--- /dev/null
+++ b/src/examples/yaml/BRUTEFORCEL1.yaml
@@ -0,0 +1,5 @@
+sensor:
+  type: "USB_CAM"
+matcher:
+  type: "BRUTEFORCEL1"
+  match type: 1     #  Match type. MATCH = 1, KNNMATCH = 2, RADIUSMATCH = 3
\ No newline at end of file
diff --git a/src/matchers/bruteforce_l1/matcher_bruteforce_l1.cpp b/src/matchers/bruteforce_l1/matcher_bruteforce_l1.cpp
new file mode 100644
index 0000000..7be9db6
--- /dev/null
+++ b/src/matchers/bruteforce_l1/matcher_bruteforce_l1.cpp
@@ -0,0 +1,17 @@
+#include "matcher_bruteforce_l1.h"
+
+namespace vision_utils {
+
+MatcherBRUTEFORCEL1::MatcherBRUTEFORCEL1(void)
+{}
+
+MatcherBRUTEFORCEL1::~MatcherBRUTEFORCEL1(void)
+{}
+
+} /* namespace vision_utils */
+
+// Register in the MatchersFactory
+namespace vision_utils
+{
+VU_REGISTER_MATCHER("BRUTEFORCEL1", MatcherBRUTEFORCEL1);
+} /* namespace vision_utils */
diff --git a/src/matchers/bruteforce_l1/matcher_bruteforce_l1.h b/src/matchers/bruteforce_l1/matcher_bruteforce_l1.h
new file mode 100644
index 0000000..99a1d49
--- /dev/null
+++ b/src/matchers/bruteforce_l1/matcher_bruteforce_l1.h
@@ -0,0 +1,66 @@
+#ifndef _MATCHER_BRUTEFORCEL1_H_
+#define _MATCHER_BRUTEFORCEL1_H_
+
+#include "../matcher_base.h"
+#include "../matcher_factory.h"
+
+// yaml-cpp library
+#ifdef USING_YAML
+	#include <yaml-cpp/yaml.h>
+#endif
+
+namespace vision_utils {
+
+// Create all pointers
+VU_PTR_TYPEDEFS(MatcherBRUTEFORCEL1);
+VU_PTR_TYPEDEFS(MatcherParamsBRUTEFORCEL1);
+
+/** \brief Class parameters
+ *
+ */
+struct MatcherParamsBRUTEFORCEL1: public MatcherParamsBase
+{
+	// TODO: Add possible parameters
+};
+
+/** \brief DETECTOR class
+ *
+ */
+class MatcherBRUTEFORCEL1 : public MatcherBase {
+
+    public:
+		MatcherBRUTEFORCEL1();
+        virtual ~MatcherBRUTEFORCEL1(void);
+
+        // Factory method
+        static MatcherBasePtr create(const std::string& _unique_name, const ParamsBasePtr _params);
+
+    private:
+
+        void defineMatcher(const ParamsBasePtr _params);
+};
+
+/*
+ * brief Define detector
+ */
+inline void MatcherBRUTEFORCEL1::defineMatcher(const ParamsBasePtr _params)
+{
+	params_base_ptr_ = std::static_pointer_cast<MatcherParamsBase>(_params);
+	MatcherParamsBRUTEFORCEL1Ptr params_ptr = std::static_pointer_cast<MatcherParamsBRUTEFORCEL1>(_params);
+    matcher_ = cv::DescriptorMatcher::create("BruteForce-L1");
+}
+
+/*
+ * brief Create object in factory
+ */
+inline MatcherBasePtr MatcherBRUTEFORCEL1::create(const std::string& _unique_name, const ParamsBasePtr _params)
+{
+    MatcherBRUTEFORCEL1Ptr mat_ptr = std::make_shared<MatcherBRUTEFORCEL1>();
+    mat_ptr->setName(_unique_name);
+    mat_ptr->defineMatcher(_params);
+    return mat_ptr;
+}
+
+} /* namespace vision_utils */
+
+#endif /* _MATCHER_BRUTEFORCEL1_H_ */
diff --git a/src/matchers/bruteforce_l1/matcher_bruteforce_l1_load_yaml.cpp b/src/matchers/bruteforce_l1/matcher_bruteforce_l1_load_yaml.cpp
new file mode 100644
index 0000000..50bf6b5
--- /dev/null
+++ b/src/matchers/bruteforce_l1/matcher_bruteforce_l1_load_yaml.cpp
@@ -0,0 +1,46 @@
+#include "matcher_bruteforce_l1.h"
+
+#ifdef USING_YAML
+
+// yaml-cpp library
+#include <yaml-cpp/yaml.h>
+
+namespace vision_utils
+{
+
+namespace
+{
+
+static ParamsBasePtr createParamsBRUTEFORCEL1Matcher(const std::string & _filename_dot_yaml)
+{
+	MatcherParamsBRUTEFORCEL1Ptr params_ptr = std::make_shared<MatcherParamsBRUTEFORCEL1>();
+
+    using std::string;
+    using YAML::Node;
+    Node yaml_params = YAML::LoadFile(_filename_dot_yaml);
+    if (!yaml_params.IsNull())
+    {
+        Node d_yaml = yaml_params["matcher"];
+        if(d_yaml["type"].as<string>() == "BRUTEFORCEL1")
+        {
+        	params_ptr->match_type	= d_yaml["match type"].as<int>();
+        	// TODO: Add possible parameters
+        }else
+        {
+            std::cerr << "Bad configuration file. Wrong type " << d_yaml["type"].as<string>() << std::endl;
+            return nullptr;
+        }
+    }
+
+	return params_ptr;
+}
+
+// Register in the SensorFactory
+const bool registered_matBRUTEFORCEL1_params = ParamsFactory::get().registerCreator("BRUTEFORCEL1 MAT", createParamsBRUTEFORCEL1Matcher);
+
+} /* namespace [unnamed] */
+
+} /* namespace vision_utils */
+
+#endif /* IF USING_YAML */
+
-- 
GitLab