31
#ifndef OPENCV_FLANN_BASE_HPP_
32
#define OPENCV_FLANN_BASE_HPP_
44
#include "all_indices.h"
53
inline
void
log_verbosity(
int
level)
56
Logger::setLevel(level);
63
struct
SavedIndexParams :
public
IndexParams
65
SavedIndexParams(cv::String filename)
67
(* this)[
"algorithm"] = FLANN_INDEX_SAVED;
68
(*this)[
"filename"] = filename;
73
template<
typename
Distance>
74NNIndex<Distance>* load_saved_index(
const
Matrix<typename Distance::ElementType>& dataset,
const
cv::String& filename, Distance distance)
76
typedef
typename
Distance::ElementType ElementType;
78
FILE* fin = fopen(filename.c_str(),
"rb");
82
IndexHeader header = load_header(fin);
83
if
(header.data_type != Datatype<ElementType>::type()) {
85
FLANN_THROW(cv::Error::StsError,
"Datatype of saved index is different than of the one to be created.");
87
if
((
size_t(header.rows) != dataset.rows)||(
size_t(header.cols) != dataset.cols)) {
89
FLANN_THROW(cv::Error::StsError,
"The index saved belongs to a different dataset");
93
params[
"algorithm"] = header.index_type;
94
NNIndex<Distance>* nnIndex = create_index_by_type<Distance>(dataset, params, distance);
95
nnIndex->loadIndex(fin);
102
template<
typename
Distance>
103
class
Index :
public
NNIndex<Distance>
106
typedef
typename
Distance::ElementType ElementType;
107
typedef
typename
Distance::ResultType DistanceType;
109
Index(
const
Matrix<ElementType>& features,
const
IndexParams& params, Distance distance = Distance() )
110
: index_params_(params)
112
flann_algorithm_t index_type = get_param<flann_algorithm_t>(params,
"algorithm");
115
if
(index_type == FLANN_INDEX_SAVED) {
116
nnIndex_ = load_saved_index<Distance>(features, get_param<cv::String>(params,
"filename"), distance);
120
nnIndex_ = create_index_by_type<Distance>(features, params, distance);
132
void
buildIndex() CV_OVERRIDE
135
nnIndex_->buildIndex();
139
void
save(cv::String filename)
141
FILE* fout = fopen(filename.c_str(),
"wb");
143
FLANN_THROW(cv::Error::StsError,
"Cannot open file");
145
save_header(fout, *nnIndex_);
154
virtual
void
saveIndex(FILE* stream) CV_OVERRIDE
156
nnIndex_->saveIndex(stream);
163
virtual
void
loadIndex(FILE* stream) CV_OVERRIDE
165
nnIndex_->loadIndex(stream);
171
size_t
veclen() const CV_OVERRIDE
173
return
nnIndex_->veclen();
179
size_t
size() const CV_OVERRIDE
181
return
nnIndex_->size();
187
flann_algorithm_t getType() const CV_OVERRIDE
189
return
nnIndex_->getType();
195
virtual
int
usedMemory() const CV_OVERRIDE
197
return
nnIndex_->usedMemory();
204
IndexParams getParameters() const CV_OVERRIDE
206
return
nnIndex_->getParameters();
217
void
knnSearch(
const
Matrix<ElementType>& queries, Matrix<int>& indices, Matrix<DistanceType>& dists,
int
knn,
const
SearchParams& params) CV_OVERRIDE
219
nnIndex_->knnSearch(queries, indices, dists, knn, params);
231
int
radiusSearch(
const
Matrix<ElementType>& query, Matrix<int>& indices, Matrix<DistanceType>& dists,
float
radius,
const
SearchParams& params) CV_OVERRIDE
233
return
nnIndex_->radiusSearch(query, indices, dists, radius, params);
239
void
findNeighbors(ResultSet<DistanceType>& result,
const
ElementType* vec,
const
SearchParams& searchParams) CV_OVERRIDE
241
nnIndex_->findNeighbors(result, vec, searchParams);
247
CV_DEPRECATED NNIndex<Distance>* getIndex()
256
CV_DEPRECATED
const
IndexParams* getIndexParameters()
258
return
&index_params_;
263
NNIndex<Distance>* nnIndex_;
267
IndexParams index_params_;
269
Index(
const
Index &);
270
Index& operator=(
const
Index &);
284
template
<
typename
Distance>
285
int
hierarchicalClustering(
const
Matrix<typename Distance::ElementType>& points, Matrix<typename Distance::CentersType>& centers,
286
const
KMeansIndexParams& params, Distance d = Distance())
288
KMeansIndex<Distance>
kmeans(points, params, d);
291
int
clusterNum =
kmeans.getClusterCenters(centers);
CV_EXPORTS_W double kmeans(InputArray data, int K, InputOutputArray bestLabels, TermCriteria criteria, int attempts, int flags, OutputArray centers=noArray())
Finds centers of clusters and groups input samples around the clusters.
int hierarchicalClustering(const Mat &features, Mat ¢ers, const ::cvflann::KMeansIndexParams ¶ms, Distance d=Distance())
Clusters features using hierarchical k-means algorithm.
Definition:
flann.hpp:584