00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef __POINTMATCHER_MATCHERS_H
00037 #define __POINTMATCHER_MATCHERS_H
00038
00039 #include "PointMatcher.h"
00040
00041 #include "nabo/nabo.h"
00042 #if NABO_VERSION_INT < 10007
00043 #error "You need libnabo version 1.0.7 or greater"
00044 #endif
00045
00046 template<typename T>
00047 struct MatchersImpl
00048 {
00049 typedef PointMatcherSupport::Parametrizable Parametrizable;
00050 typedef PointMatcherSupport::Parametrizable P;
00051 typedef Parametrizable::Parameters Parameters;
00052 typedef Parametrizable::ParameterDoc ParameterDoc;
00053 typedef Parametrizable::ParametersDoc ParametersDoc;
00054
00055 typedef typename Nabo::NearestNeighbourSearch<T> NNS;
00056 typedef typename NNS::SearchType NNSearchType;
00057
00058 typedef typename PointMatcher<T>::DataPoints DataPoints;
00059 typedef typename PointMatcher<T>::Matcher Matcher;
00060 typedef typename PointMatcher<T>::Matches Matches;
00061
00062 struct NullMatcher: public Matcher
00063 {
00064 inline static const std::string description()
00065 {
00066 return "Does nothing, returns no match.";
00067 }
00068
00069 NullMatcher() : Matcher("NullMatcher", ParametersDoc(), Parameters()) {}
00070 virtual void init(const DataPoints& filteredReference);
00071 virtual Matches findClosests(const DataPoints& filteredReading);
00072 };
00073
00074 struct KDTreeMatcher: public Matcher
00075 {
00076 inline static const std::string description()
00077 {
00078 return "This matcher matches a point from the reading to its closest neighbors in the reference.";
00079 }
00080 inline static const ParametersDoc availableParameters()
00081 {
00082 return {
00083 {"knn", "number of nearest neighbors to consider it the reference", "1", "1", "2147483647", &P::Comp<unsigned>},
00084 {"epsilon", "approximation to use for the nearest-neighbor search", "0", "0", "inf", &P::Comp<T>},
00085 {"searchType", "Nabo search type. 0: brute force, check distance to every point in the data (very slow), 1: kd-tree with linear heap, good for small knn (~up to 30) and 2: kd-tree with tree heap, good for large knn (~from 30)", "1", "0", "2", &P::Comp<unsigned>},
00086 {"maxDist", "maximum distance to consider for neighbors", "inf", "0", "inf", &P::Comp<T>}
00087 };
00088 }
00089
00090 const int knn;
00091 const T epsilon;
00092 const NNSearchType searchType;
00093 const T maxDist;
00094
00095 protected:
00096 std::shared_ptr<NNS> featureNNS;
00097
00098 public:
00099 KDTreeMatcher(const Parameters& params = Parameters());
00100 virtual ~KDTreeMatcher();
00101 virtual void init(const DataPoints& filteredReference);
00102 virtual Matches findClosests(const DataPoints& filteredReading);
00103 };
00104
00105 struct KDTreeVarDistMatcher: public Matcher
00106 {
00107 inline static const std::string description()
00108 {
00109 return "This matcher matches a point from the reading to its closest neighbors in the reference. A maximum search radius per point can be defined.";
00110 }
00111 inline static const ParametersDoc availableParameters()
00112 {
00113 return {
00114 {"knn", "number of nearest neighbors to consider it the reference", "1", "1", "2147483647", &P::Comp<unsigned>},
00115 {"epsilon", "approximation to use for the nearest-neighbor search", "0", "0", "inf", &P::Comp<T>},
00116 {"searchType", "Nabo search type. 0: brute force, check distance to every point in the data (very slow), 1: kd-tree with linear heap, good for small knn (~up to 30) and 2: kd-tree with tree heap, good for large knn (~from 30)", "1", "0", "2", &P::Comp<unsigned>},
00117 {"maxDistField", "descriptor field name used to set a maximum distance to consider for neighbors per point", "maxSearchDist"}
00118 };
00119 }
00120
00121 const int knn;
00122 const T epsilon;
00123 const NNSearchType searchType;
00124 const std::string maxDistField;
00125
00126 protected:
00127 std::shared_ptr<NNS> featureNNS;
00128
00129 public:
00130 KDTreeVarDistMatcher(const Parameters& params = Parameters());
00131 virtual ~KDTreeVarDistMatcher();
00132 virtual void init(const DataPoints& filteredReference);
00133 virtual Matches findClosests(const DataPoints& filteredReading);
00134 };
00135
00136 };
00137
00138 #endif // __POINTMATCHER_MATCHERS_H