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 #ifndef OPENCV_FLANN_ALL_INDICES_H_
00031 #define OPENCV_FLANN_ALL_INDICES_H_
00032
00033 #include "general.h"
00034
00035 #include "nn_index.h"
00036 #include "kdtree_index.h"
00037 #include "kdtree_single_index.h"
00038 #include "kmeans_index.h"
00039 #include "composite_index.h"
00040 #include "linear_index.h"
00041 #include "hierarchical_clustering_index.h"
00042 #include "lsh_index.h"
00043 #include "autotuned_index.h"
00044
00045
00046 namespace cvflann
00047 {
00048
00049 template<typename KDTreeCapability, typename VectorSpace, typename Distance>
00050 struct index_creator
00051 {
00052 static NNIndex<Distance>* create(const Matrix<typename Distance::ElementType>& dataset, const IndexParams& params, const Distance& distance)
00053 {
00054 flann_algorithm_t index_type = get_param<flann_algorithm_t>(params, "algorithm");
00055
00056 NNIndex<Distance>* nnIndex;
00057 switch (index_type) {
00058 case FLANN_INDEX_LINEAR:
00059 nnIndex = new LinearIndex<Distance>(dataset, params, distance);
00060 break;
00061 case FLANN_INDEX_KDTREE_SINGLE:
00062 nnIndex = new KDTreeSingleIndex<Distance>(dataset, params, distance);
00063 break;
00064 case FLANN_INDEX_KDTREE:
00065 nnIndex = new KDTreeIndex<Distance>(dataset, params, distance);
00066 break;
00067 case FLANN_INDEX_KMEANS:
00068 nnIndex = new KMeansIndex<Distance>(dataset, params, distance);
00069 break;
00070 case FLANN_INDEX_COMPOSITE:
00071 nnIndex = new CompositeIndex<Distance>(dataset, params, distance);
00072 break;
00073 case FLANN_INDEX_AUTOTUNED:
00074 nnIndex = new AutotunedIndex<Distance>(dataset, params, distance);
00075 break;
00076 case FLANN_INDEX_HIERARCHICAL:
00077 nnIndex = new HierarchicalClusteringIndex<Distance>(dataset, params, distance);
00078 break;
00079 case FLANN_INDEX_LSH:
00080 nnIndex = new LshIndex<Distance>(dataset, params, distance);
00081 break;
00082 default:
00083 throw FLANNException("Unknown index type");
00084 }
00085
00086 return nnIndex;
00087 }
00088 };
00089
00090 template<typename VectorSpace, typename Distance>
00091 struct index_creator<False,VectorSpace,Distance>
00092 {
00093 static NNIndex<Distance>* create(const Matrix<typename Distance::ElementType>& dataset, const IndexParams& params, const Distance& distance)
00094 {
00095 flann_algorithm_t index_type = get_param<flann_algorithm_t>(params, "algorithm");
00096
00097 NNIndex<Distance>* nnIndex;
00098 switch (index_type) {
00099 case FLANN_INDEX_LINEAR:
00100 nnIndex = new LinearIndex<Distance>(dataset, params, distance);
00101 break;
00102 case FLANN_INDEX_KMEANS:
00103 nnIndex = new KMeansIndex<Distance>(dataset, params, distance);
00104 break;
00105 case FLANN_INDEX_HIERARCHICAL:
00106 nnIndex = new HierarchicalClusteringIndex<Distance>(dataset, params, distance);
00107 break;
00108 case FLANN_INDEX_LSH:
00109 nnIndex = new LshIndex<Distance>(dataset, params, distance);
00110 break;
00111 default:
00112 throw FLANNException("Unknown index type");
00113 }
00114
00115 return nnIndex;
00116 }
00117 };
00118
00119 template<typename Distance>
00120 struct index_creator<False,False,Distance>
00121 {
00122 static NNIndex<Distance>* create(const Matrix<typename Distance::ElementType>& dataset, const IndexParams& params, const Distance& distance)
00123 {
00124 flann_algorithm_t index_type = get_param<flann_algorithm_t>(params, "algorithm");
00125
00126 NNIndex<Distance>* nnIndex;
00127 switch (index_type) {
00128 case FLANN_INDEX_LINEAR:
00129 nnIndex = new LinearIndex<Distance>(dataset, params, distance);
00130 break;
00131 case FLANN_INDEX_HIERARCHICAL:
00132 nnIndex = new HierarchicalClusteringIndex<Distance>(dataset, params, distance);
00133 break;
00134 case FLANN_INDEX_LSH:
00135 nnIndex = new LshIndex<Distance>(dataset, params, distance);
00136 break;
00137 default:
00138 throw FLANNException("Unknown index type");
00139 }
00140
00141 return nnIndex;
00142 }
00143 };
00144
00145 template<typename Distance>
00146 NNIndex<Distance>* create_index_by_type(const Matrix<typename Distance::ElementType>& dataset, const IndexParams& params, const Distance& distance)
00147 {
00148 return index_creator<typename Distance::is_kdtree_distance,
00149 typename Distance::is_vector_space_distance,
00150 Distance>::create(dataset, params,distance);
00151 }
00152
00153 }
00154
00155 #endif