From c06006be458c6b8cea357b05b58a0c8635ddbec5 Mon Sep 17 00:00:00 2001
From: asantamaria <asantamaria@iri.upc.edu>
Date: Wed, 9 Aug 2017 17:26:11 +0200
Subject: [PATCH] added daisy descriptor

---
 src/CMakeLists.txt                            |  5 +-
 src/descriptors/daisy/descriptor_daisy.cpp    | 17 ++++
 src/descriptors/daisy/descriptor_daisy.h      | 81 +++++++++++++++++++
 .../daisy/descriptor_daisy_load_yaml.cpp      | 53 ++++++++++++
 src/examples/test_descriptor.cpp              |  6 +-
 src/examples/yaml/DAISY.yaml                  | 11 +++
 6 files changed, 169 insertions(+), 4 deletions(-)
 create mode 100644 src/descriptors/daisy/descriptor_daisy.cpp
 create mode 100644 src/descriptors/daisy/descriptor_daisy.h
 create mode 100644 src/descriptors/daisy/descriptor_daisy_load_yaml.cpp
 create mode 100644 src/examples/yaml/DAISY.yaml

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 76d33bb..a03903d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -48,6 +48,8 @@ SET(sources
 	descriptors/freak/descriptor_freak_load_yaml.cpp
 	descriptors/brief/descriptor_brief.cpp
 	descriptors/brief/descriptor_brief_load_yaml.cpp
+	descriptors/daisy/descriptor_daisy.cpp
+	descriptors/daisy/descriptor_daisy_load_yaml.cpp
 	matchers/matcher_base.cpp )
 
 # application header files
@@ -81,7 +83,8 @@ SET(headers
 	descriptors/akaze/descriptor_akaze.h
 	descriptors/latch/descriptor_latch.h
 	descriptors/freak/descriptor_freak.h
-	descriptors/brief/descriptor_brief.h	
+	descriptors/brief/descriptor_brief.h
+	descriptors/daisy/descriptor_daisy.h
 	matchers/matcher_factory.h
 	matchers/matcher_base.h)
 
diff --git a/src/descriptors/daisy/descriptor_daisy.cpp b/src/descriptors/daisy/descriptor_daisy.cpp
new file mode 100644
index 0000000..788b0fe
--- /dev/null
+++ b/src/descriptors/daisy/descriptor_daisy.cpp
@@ -0,0 +1,17 @@
+#include "descriptor_daisy.h"
+
+namespace vision_utils {
+
+DescriptorDAISY::DescriptorDAISY(void)
+{}
+
+DescriptorDAISY::~DescriptorDAISY(void)
+{}
+
+} /* namespace vision_utils */
+
+// Register in the DescriptorsFactory
+namespace vision_utils
+{
+VU_REGISTER_DESCRIPTOR("DAISY", DescriptorDAISY);
+} /* namespace vision_utils */
diff --git a/src/descriptors/daisy/descriptor_daisy.h b/src/descriptors/daisy/descriptor_daisy.h
new file mode 100644
index 0000000..9d949c2
--- /dev/null
+++ b/src/descriptors/daisy/descriptor_daisy.h
@@ -0,0 +1,81 @@
+#ifndef _DESCRIPTOR_DAISY_H_
+#define _DESCRIPTOR_DAISY_H_
+
+#include "../descriptor_base.h"
+#include "../descriptor_factory.h"
+
+// yaml-cpp library
+#ifdef USING_YAML
+	#include <yaml-cpp/yaml.h>
+#endif
+
+namespace vision_utils {
+
+// Create all pointers
+VU_PTR_TYPEDEFS(DescriptorDAISY);
+VU_PTR_TYPEDEFS(DescriptorParamsDAISY);
+
+/** \DAISY Class parameters
+ *
+ */
+struct DescriptorParamsDAISY: public ParamsBase
+{
+	float radius = 15;								// Radius of the descriptor at the initial scale
+	int q_radius = 3;								// Amount of radial range division quantity
+	int q_theta = 8;								// Amount of angular range division quantity
+	int q_hist = 8;									// Amount of gradient orientations range division quantity
+	int norm = cv::xfeatures2d::DAISY::NRM_NONE;	// Descriptors normalization type. DAISY::NRM_NONE=100 will not do any normalization (default), DAISY::NRM_PARTIAL=101 mean that histograms are normalized independently for L2 norm equal to 1.0, DAISY::NRM_FULL=102 mean that descriptors are normalized for L2 norm equal to 1.0, DAISY::NRM_SIFT=103 mean that descriptors are normalized for L2 norm equal to 1.0 but no individual one is bigger than 0.154 as in SIFT
+	cv::InputOutputArray H = cv::noArray();			// Optional 3x3 homography matrix used to warp the grid of daisy but sampling keypoints remains unwarped on image
+	bool interpolation = true;						// Switch to disable interpolation for speed improvement at minor quality loss
+	bool use_orientation = false;					// Sample patterns using keypoints orientation, disabled by default
+};
+
+/** \DAISY DETECTOR class
+ *
+ */
+class DescriptorDAISY : public DescriptorBase {
+
+    public:
+		DescriptorDAISY();
+        virtual ~DescriptorDAISY(void);
+
+        // Factory method
+        static DescriptorBasePtr create(const std::string& _unique_name, const ParamsBasePtr _params);
+
+    private:
+
+        void defineDescriptor(const ParamsBasePtr _params);
+};
+
+/*
+ * DAISY Define detector
+ */
+inline void DescriptorDAISY::defineDescriptor(const ParamsBasePtr _params)
+{
+    DescriptorParamsDAISYPtr params_ptr = std::static_pointer_cast<DescriptorParamsDAISY>(_params);
+
+    descriptor_ = cv::xfeatures2d::DAISY::create(params_ptr->radius,
+    		params_ptr->q_radius,
+			params_ptr->q_theta,
+			params_ptr->q_hist,
+			params_ptr->norm,
+			params_ptr->H,
+			params_ptr->interpolation,
+			params_ptr->use_orientation);
+}
+
+
+/*
+ * DAISY Create object in factory
+ */
+inline DescriptorBasePtr DescriptorDAISY::create(const std::string& _unique_name, const ParamsBasePtr _params)
+{
+    DescriptorDAISYPtr det_ptr = std::make_shared<DescriptorDAISY>();
+    det_ptr->setName(_unique_name);
+    det_ptr->defineDescriptor(_params);
+    return det_ptr;
+}
+
+} /* namespace vision_utils */
+
+#endif /* _DESCRIPTOR_DAISY_H_ */
diff --git a/src/descriptors/daisy/descriptor_daisy_load_yaml.cpp b/src/descriptors/daisy/descriptor_daisy_load_yaml.cpp
new file mode 100644
index 0000000..b714a9e
--- /dev/null
+++ b/src/descriptors/daisy/descriptor_daisy_load_yaml.cpp
@@ -0,0 +1,53 @@
+#include "descriptor_daisy.h"
+
+#ifdef USING_YAML
+
+// yaml-cpp library
+#include <yaml-cpp/yaml.h>
+
+namespace vision_utils
+{
+
+namespace
+{
+
+static ParamsBasePtr createParamsDAISYDescriptor(const std::string & _filename_dot_yaml)
+{
+	DescriptorParamsDAISYPtr params_ptr = std::make_shared<DescriptorParamsDAISY>();
+
+    using std::string;
+    using YAML::Node;
+    Node yaml_params = YAML::LoadFile(_filename_dot_yaml);
+    if (!yaml_params.IsNull())
+    {
+        Node d_yaml = yaml_params["descriptor"];
+        if(d_yaml["type"].as<string>() == "DAISY")
+        {
+        	params_ptr->radius				= d_yaml["radius"].as<float>();
+ 	        params_ptr->q_radius			= d_yaml["q_radius"].as<int>();
+        	params_ptr->q_theta				= d_yaml["q_theta"].as<int>();
+        	params_ptr->q_hist				= d_yaml["q_hist"].as<int>();
+        	params_ptr->norm				= d_yaml["norm"].as<int>();
+        	// Currently not implemented
+        	// std::vector<std::vector<float> > Hread = d_yaml["H"].as<std::vector<std::vector<float> > >();
+        	params_ptr->interpolation		= d_yaml["interpolation"].as<bool>();
+        	params_ptr->use_orientation		= d_yaml["use_orientation"].as<bool>();
+        }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_desDAISY_params = ParamsFactory::get().registerCreator("DAISY DES", createParamsDAISYDescriptor);
+
+} /* namespace [unnamed] */
+
+} /* namespace vision_utils */
+
+#endif /* IF USING_YAML */
+
diff --git a/src/examples/test_descriptor.cpp b/src/examples/test_descriptor.cpp
index 3b30462..e408c7a 100644
--- a/src/examples/test_descriptor.cpp
+++ b/src/examples/test_descriptor.cpp
@@ -31,7 +31,7 @@
 #include "../descriptors/latch/descriptor_latch.h"
 #include "../descriptors/freak/descriptor_freak.h"
 #include "../descriptors/brief/descriptor_brief.h"
-//#include "../descriptors/daisy/descriptor_daisy.h"
+#include "../descriptors/daisy/descriptor_daisy.h"
 //#include "../descriptors/lucid/descriptor_lucid.h"
 
 int main(void)
@@ -108,8 +108,8 @@ int main(void)
     	des_ptr = std::static_pointer_cast<DescriptorFREAK>(des_ptr);
     else if (des_name.compare("BRIEF") == 0)
     	des_ptr = std::static_pointer_cast<DescriptorBRIEF>(des_ptr);
-//    else if (des_name.compare("DAISY") == 0)
-//    	des_ptr = std::static_pointer_cast<DescriptorDAISY>(des_ptr);
+    else if (des_name.compare("DAISY") == 0)
+    	des_ptr = std::static_pointer_cast<DescriptorDAISY>(des_ptr);
 //    else if (des_name.compare("LUCID") == 0)
 //    	des_ptr = std::static_pointer_cast<DescriptorLUCID>(des_ptr);
 
diff --git a/src/examples/yaml/DAISY.yaml b/src/examples/yaml/DAISY.yaml
new file mode 100644
index 0000000..06d6bbe
--- /dev/null
+++ b/src/examples/yaml/DAISY.yaml
@@ -0,0 +1,11 @@
+sensor:
+  type: "USB_CAM"
+descriptor:
+  type: "DAISY"
+  radius: 15
+  q_radius: 3
+  q_theta: 8
+  q_hist: 8
+  norm:  100                # Descriptors normalization type. DAISY::NRM_NONE=100 (default), DAISY::NRM_PARTIAL=101, DAISY::NRM_FULL=102, DAISY::NRM_SIFT=103
+  interpolation: true
+  use_orientation: false  
\ No newline at end of file
-- 
GitLab