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