31
#ifndef OPENCV_FLANN_COMPOSITE_INDEX_H_
32
#define OPENCV_FLANN_COMPOSITE_INDEX_H_
37
#include "kdtree_index.h"
38
#include "kmeans_index.h"
46
struct
CompositeIndexParams :
public
IndexParams
48
CompositeIndexParams(
int
trees = 4,
int
branching = 32,
int
iterations = 11,
49
flann_centers_init_t centers_init = FLANN_CENTERS_RANDOM,
float
cb_index = 0.2 )
51
(*this)[
"algorithm"] = FLANN_INDEX_KMEANS;
53
(*this)[
"trees"] = trees;
55
(*this)[
"branching"] = branching;
57
(*this)[
"iterations"] = iterations;
59
(*this)[
"centers_init"] = centers_init;
61
(*this)[
"cb_index"] = cb_index;
71
template
<
typename
Distance>
72
class
CompositeIndex :
public
NNIndex<Distance>
75
typedef
typename
Distance::ElementType ElementType;
76
typedef
typename
Distance::ResultType DistanceType;
85
CompositeIndex(
const
Matrix<ElementType>& inputData,
const
IndexParams& params = CompositeIndexParams(),
86
Distance d = Distance()) : index_params_(params)
88
kdtree_index_ =
new
KDTreeIndex<Distance>(inputData, params, d);
89
kmeans_index_ =
new
KMeansIndex<Distance>(inputData, params, d);
93
CompositeIndex(
const
CompositeIndex&);
94
CompositeIndex& operator=(
const
CompositeIndex&);
96
virtual
~CompositeIndex()
105
flann_algorithm_t getType() const CV_OVERRIDE
107
return
FLANN_INDEX_COMPOSITE;
113
size_t
size() const CV_OVERRIDE
115
return
kdtree_index_->size();
121
size_t
veclen() const CV_OVERRIDE
123
return
kdtree_index_->veclen();
129
int
usedMemory() const CV_OVERRIDE
131
return
kmeans_index_->usedMemory() + kdtree_index_->usedMemory();
137
void
buildIndex() CV_OVERRIDE
139
Logger::info(
"Building kmeans tree...\n");
140
kmeans_index_->buildIndex();
141
Logger::info(
"Building kdtree tree...\n");
142
kdtree_index_->buildIndex();
149
void
saveIndex(FILE* stream) CV_OVERRIDE
151
kmeans_index_->saveIndex(stream);
152
kdtree_index_->saveIndex(stream);
159
void
loadIndex(FILE* stream) CV_OVERRIDE
161
kmeans_index_->loadIndex(stream);
162
kdtree_index_->loadIndex(stream);
168
IndexParams getParameters() const CV_OVERRIDE
170
return
index_params_;
176
void
findNeighbors(ResultSet<DistanceType>& result,
const
ElementType* vec,
const
SearchParams& searchParams) CV_OVERRIDE
178
kmeans_index_->findNeighbors(result, vec, searchParams);
179
kdtree_index_->findNeighbors(result, vec, searchParams);
184
KMeansIndex<Distance>* kmeans_index_;
187
KDTreeIndex<Distance>* kdtree_index_;
190
const
IndexParams index_params_;