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 template<typename T>
00042 struct MatchersImpl
00043 {
00044 typedef PointMatcherSupport::Parametrizable Parametrizable;
00045 typedef PointMatcherSupport::Parametrizable P;
00046 typedef Parametrizable::Parameters Parameters;
00047 typedef Parametrizable::ParameterDoc ParameterDoc;
00048 typedef Parametrizable::ParametersDoc ParametersDoc;
00049
00050 typedef typename Nabo::NearestNeighbourSearch<T> NNS;
00051 typedef typename NNS::SearchType NNSearchType;
00052
00053 typedef typename PointMatcher<T>::DataPoints DataPoints;
00054 typedef typename PointMatcher<T>::Matcher Matcher;
00055 typedef typename PointMatcher<T>::Matches Matches;
00056
00057 struct NullMatcher: public Matcher
00058 {
00059 inline static const std::string description()
00060 {
00061 return "Does nothing, returns no match.";
00062 }
00063
00064 virtual void init(const DataPoints& filteredReference);
00065 virtual Matches findClosests(const DataPoints& filteredReading);
00066 };
00067
00068 struct KDTreeMatcher: public Matcher
00069 {
00070 inline static const std::string description()
00071 {
00072 return "This matcher matches a point from the reading to its closest neighbors in the reference.";
00073 }
00074 inline static const ParametersDoc availableParameters()
00075 {
00076 return boost::assign::list_of<ParameterDoc>
00077 ( "knn", "number of nearest neighbors to consider it the reference", "1", "1", "2147483647", &P::Comp<unsigned> )
00078 ( "epsilon", "approximation to use for the nearest-neighbor search", "0", "0", "inf", &P::Comp<T> )
00079 ( "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> )
00080 ( "maxDist", "maximum distance to consider for neighbors", "inf", "0", "inf", &P::Comp<T> )
00081 ;
00082 }
00083
00084 const int knn;
00085 const T epsilon;
00086 const NNSearchType searchType;
00087 const T maxDist;
00088
00089 protected:
00090 boost::shared_ptr<NNS> featureNNS;
00091
00092 public:
00093 KDTreeMatcher(const Parameters& params = Parameters());
00094 virtual ~KDTreeMatcher();
00095 virtual void init(const DataPoints& filteredReference);
00096 virtual Matches findClosests(const DataPoints& filteredReading);
00097 };
00098
00099 struct KDTreeVarDistMatcher: public Matcher
00100 {
00101 inline static const std::string description()
00102 {
00103 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.";
00104 }
00105 inline static const ParametersDoc availableParameters()
00106 {
00107 return boost::assign::list_of<ParameterDoc>
00108 ( "knn", "number of nearest neighbors to consider it the reference", "1", "1", "2147483647", &P::Comp<unsigned> )
00109 ( "epsilon", "approximation to use for the nearest-neighbor search", "0", "0", "inf", &P::Comp<T> )
00110 ( "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> )
00111 ( "maxDistField", "descriptor field name used to set a maximum distance to consider for neighbors per point", "maxSearchDist" )
00112 ;
00113 }
00114
00115 const int knn;
00116 const T epsilon;
00117 const NNSearchType searchType;
00118 const std::string maxDistField;
00119
00120 protected:
00121 boost::shared_ptr<NNS> featureNNS;
00122
00123 public:
00124 KDTreeVarDistMatcher(const Parameters& params = Parameters());
00125 virtual ~KDTreeVarDistMatcher();
00126 virtual void init(const DataPoints& filteredReference);
00127 virtual Matches findClosests(const DataPoints& filteredReading);
00128 };
00129
00130 };
00131
00132 #endif // __POINTMATCHER_MATCHERS_H