43 #ifndef _OPENCV_FLANN_HPP_
44 #define _OPENCV_FLANN_HPP_
65 template <
typename T>
struct CvType {};
66 template <>
struct CvType<unsigned
char> {
static int type() {
return CV_8U; } };
68 template <>
struct CvType<unsigned
short> {
static int type() {
return CV_16U; } };
70 template <>
struct CvType<
int> {
static int type() {
return CV_32S; } };
80 using ::cvflann::L2_Simple;
83 using ::cvflann::MinkowskiDistance;
84 using ::cvflann::MaxDistance;
86 using ::cvflann::Hamming;
87 using ::cvflann::Hamming2;
88 using ::cvflann::HistIntersectionDistance;
89 using ::cvflann::HellingerDistance;
90 using ::cvflann::ChiSquareDistance;
91 using ::cvflann::KL_Divergence;
95 template <
typename Distance>
107 vector<DistanceType>& dists,
int knn, const ::cvflann::SearchParams& params);
111 vector<DistanceType>& dists,
DistanceType radius, const ::cvflann::SearchParams& params);
117 int veclen()
const {
return nnIndex->veclen(); }
119 int size()
const {
return nnIndex->size(); }
130 #define FLANN_DISTANCE_CHECK \
131 if ( ::cvflann::flann_distance_type() != cvflann::FLANN_DIST_L2) { \
132 printf("[WARNING] You are using cv::flann::Index (or cv::flann::GenericIndex) and have also changed "\
133 "the distance using cvflann::set_distance_type. This is no longer working as expected "\
134 "(cv::flann::Index always uses L2). You should create the index templated on the distance, "\
135 "for example for L1 distance use: GenericIndex< L1<float> > \n"); \
139 template <
typename Distance>
146 nnIndex = new ::cvflann::Index<Distance>(m_dataset,
params, distance);
150 nnIndex->buildIndex();
153 template <
typename Distance>
159 template <
typename Distance>
168 nnIndex->knnSearch(m_query,m_indices,m_dists,knn,searchParams);
172 template <
typename Distance>
179 CV_Assert(indices.
type() == CV_32S);
189 nnIndex->knnSearch(m_queries,m_indices,m_dists,knn, searchParams);
192 template <
typename Distance>
201 return nnIndex->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
204 template <
typename Distance>
211 CV_Assert(indices.
type() == CV_32S);
221 return nnIndex->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
227 template <
typename T>
241 void knnSearch(
const vector<ElementType>& query, vector<int>&
indices, vector<DistanceType>& dists,
int knn, const ::cvflann::SearchParams&
params);
242 void knnSearch(
const Mat& queries,
Mat&
indices,
Mat& dists,
int knn, const ::cvflann::SearchParams&
params);
244 int radiusSearch(
const vector<ElementType>& query, vector<int>&
indices, vector<DistanceType>& dists, DistanceType
radius, const ::cvflann::SearchParams&
params);
249 if (nnIndex_L1) nnIndex_L1->save(filename);
250 if (nnIndex_L2) nnIndex_L2->save(filename);
255 if (nnIndex_L1)
return nnIndex_L1->veclen();
256 if (nnIndex_L2)
return nnIndex_L2->veclen();
261 if (nnIndex_L1)
return nnIndex_L1->size();
262 if (nnIndex_L2)
return nnIndex_L2->size();
267 if (nnIndex_L1)
return nnIndex_L1->getParameters();
268 if (nnIndex_L2)
return nnIndex_L2->getParameters();
274 if (nnIndex_L1)
return nnIndex_L1->getIndexParameters();
275 if (nnIndex_L2)
return nnIndex_L2->getIndexParameters();
285 template <
typename T>
289 template <
typename T>
292 printf(
"[WARNING] The cv::flann::Index_<T> class is deperecated, use cv::flann::GenericIndex<Distance> instead\n");
300 nnIndex_L2 = new ::cvflann::Index< L2<ElementType> >(m_dataset,
params);
303 nnIndex_L1 = new ::cvflann::Index< L1<ElementType> >(m_dataset,
params);
307 printf(
"[ERROR] cv::flann::Index_<T> only provides backwards compatibility for the L1 and L2 distances. "
308 "For other distance types you must use cv::flann::GenericIndex<Distance>\n");
311 if (nnIndex_L1) nnIndex_L1->buildIndex();
312 if (nnIndex_L2) nnIndex_L2->buildIndex();
315 template <
typename T>
318 if (nnIndex_L1)
delete nnIndex_L1;
319 if (nnIndex_L2)
delete nnIndex_L2;
322 template <
typename T>
323 void Index_<T>::knnSearch(
const vector<ElementType>& query, vector<int>&
indices, vector<DistanceType>& dists,
int knn, const ::cvflann::SearchParams& searchParams)
329 if (nnIndex_L1) nnIndex_L1->knnSearch(m_query,m_indices,m_dists,knn,searchParams);
330 if (nnIndex_L2) nnIndex_L2->knnSearch(m_query,m_indices,m_dists,knn,searchParams);
334 template <
typename T>
341 CV_Assert(indices.
type() == CV_32S);
349 if (nnIndex_L1) nnIndex_L1->knnSearch(m_queries,m_indices,m_dists,knn, searchParams);
350 if (nnIndex_L2) nnIndex_L2->knnSearch(m_queries,m_indices,m_dists,knn, searchParams);
353 template <
typename T>
360 if (nnIndex_L1)
return nnIndex_L1->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
361 if (nnIndex_L2)
return nnIndex_L2->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
364 template <
typename T>
371 CV_Assert(indices.
type() == CV_32S);
379 if (nnIndex_L1)
return nnIndex_L1->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
380 if (nnIndex_L2)
return nnIndex_L2->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
384 template <
typename Distance>
386 Distance
d = Distance())
388 typedef typename Distance::ElementType ElementType;
389 typedef typename Distance::ResultType DistanceType;
399 return ::cvflann::hierarchicalClustering<Distance>(m_features, m_centers,
params,
d);
403 template <
typename ELEM_TYPE,
typename DIST_TYPE>
406 printf(
"[WARNING] cv::flann::hierarchicalClustering<ELEM_TYPE,DIST_TYPE> is deprecated, use "
407 "cv::flann::hierarchicalClustering<Distance> instead\n");
410 return hierarchicalClustering< L2<ELEM_TYPE> >(features, centers,
params);
413 return hierarchicalClustering< L1<ELEM_TYPE> >(features, centers,
params);
416 printf(
"[ERROR] cv::flann::hierarchicalClustering<ELEM_TYPE,DIST_TYPE> only provides backwards "
417 "compatibility for the L1 and L2 distances. "
418 "For other distance types you must use cv::flann::hierarchicalClustering<Distance>\n");
425 #endif // __cplusplus
Definition: defines.h:131
int size() const
Definition: flann.hpp:259
const CvArr CvSeq CvSeq CvMemStorage CvSURFParams params
Definition: compat.hpp:647
short float uchar uchar uchar uchar uchar ushort int uchar ushort int float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float int int int float int int int float int CV_CUDEV_IMPLEMENT_VEC_BINARY_OP char CV_CUDEV_IMPLEMENT_VEC_BINARY_OP ushort CV_CUDEV_IMPLEMENT_VEC_BINARY_OP short CV_CUDEV_IMPLEMENT_VEC_BINARY_OP int CV_CUDEV_IMPLEMENT_VEC_BINARY_OP uint CV_CUDEV_IMPLEMENT_VEC_BINARY_OP float CV_CUDEV_IMPLEMENT_VEC_BINARY_OP double char
Definition: vec_math.hpp:426
int rows
the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions ...
Definition: core.hpp:1962
const CvArr int distance_type
Definition: imgproc_c.h:287
uchar * ptr(int i0=0)
returns pointer to i0-th submatrix along the dimension #0
Definition: mat.hpp:414
Definition: flann.hpp:228
T get_param(const IndexParams ¶ms, std::string name, const T &default_value)
Definition: params.h:59
const char const char ** filename
Definition: core_c.h:1750
static int type()
Definition: flann.hpp:67
static int type()
Definition: flann.hpp:68
int veclen() const
Definition: flann.hpp:117
FLANN_DEPRECATED CV_EXPORTS void set_distance_type(flann_distance_t distance_type, int order)
CV_EXPORTS flann_distance_t flann_distance_type()
Definition: defines.h:129
Distance::ElementType ElementType
Definition: flann.hpp:99
static int type()
Definition: flann.hpp:72
static int type()
Definition: flann.hpp:70
Definition: flann_base.hpp:101
void print_params(const IndexParams ¶ms)
Definition: params.h:82
int d
Definition: legacy.hpp:3064
Accumulator< T >::Type ResultType
Definition: features2d.hpp:976
static int type()
Definition: flann.hpp:66
Index_(const Mat &features, const ::cvflann::IndexParams ¶ms)
Definition: flann.hpp:290
Distance::ResultType DistanceType
Definition: flann.hpp:100
int size() const
Definition: flann.hpp:119
::cvflann::IndexParams getParameters()
Definition: flann.hpp:265
int cols
Definition: core.hpp:1962
int type() const
returns element type, similar to CV_MAT_TYPE(cvmat->type)
Definition: mat.hpp:399
FLANN_DEPRECATEDconst::cvflann::IndexParams * getIndexParameters()
Definition: flann.hpp:123
L2< T >::ResultType DistanceType
Definition: flann.hpp:235
class FLANN_DEPRECATED Index_
Definition: flann.hpp:286
GLuint GLuint GLsizei GLenum const GLvoid * indices
Definition: legacy.hpp:3084
void knnSearch(const vector< ElementType > &query, vector< int > &indices, vector< DistanceType > &dists, int knn, const ::cvflann::SearchParams ¶ms)
Definition: flann.hpp:323
CvArr int order
Definition: core_c.h:704
::cvflann::IndexParams getParameters()
Definition: flann.hpp:121
void save(std::string filename)
Definition: flann.hpp:115
static int type()
Definition: flann.hpp:69
L2< T >::ElementType ElementType
Definition: flann.hpp:234
The n-dimensional matrix class.
Definition: core.hpp:1688
void save(std::string filename)
Definition: flann.hpp:247
std::map< std::string, any > IndexParams
Definition: params.h:42
GLenum const GLfloat * params
Definition: compat.hpp:688
~GenericIndex()
Definition: flann.hpp:154
int int type
Definition: core_c.h:109
int radiusSearch(const vector< ElementType > &query, vector< int > &indices, vector< DistanceType > &dists, DistanceType radius, const ::cvflann::SearchParams ¶ms)
Definition: flann.hpp:193
Hamming HammingLUT
Definition: features2d.hpp:1018
int veclen() const
Definition: flann.hpp:253
int radiusSearch(const vector< ElementType > &query, vector< int > &indices, vector< DistanceType > &dists, DistanceType radius, const ::cvflann::SearchParams ¶ms)
Definition: flann.hpp:354
GenericIndex(const Mat &features, const ::cvflann::IndexParams ¶ms, Distance distance=Distance())
Definition: flann.hpp:140
FLANN_DEPRECATEDconst::cvflann::IndexParams * getIndexParameters()
Definition: flann.hpp:272
::max::max::max float
Definition: functional.hpp:326
static int type()
Definition: flann.hpp:71
::max::max int
Definition: functional.hpp:324
short
Definition: vec_math.hpp:153
~Index_()
Definition: flann.hpp:316
bool isContinuous() const
returns true iff the matrix data is continuous
Definition: mat.hpp:395
int hierarchicalClustering(const Mat &features, Mat ¢ers, const ::cvflann::KMeansIndexParams ¶ms, Distance d=Distance())
Definition: flann.hpp:385
CvPoint int radius
Definition: core_c.h:1290
Definition: features2d.hpp:972
flann_distance_t
Definition: defines.h:126
void knnSearch(const vector< ElementType > &query, vector< int > &indices, vector< DistanceType > &dists, int knn, const ::cvflann::SearchParams ¶ms)
Definition: flann.hpp:160
short float uchar uchar uchar uchar uchar ushort int uchar ushort int float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float int int int float int int int float int CV_CUDEV_IMPLEMENT_VEC_BINARY_OP char CV_CUDEV_IMPLEMENT_VEC_BINARY_OP ushort CV_CUDEV_IMPLEMENT_VEC_BINARY_OP short CV_CUDEV_IMPLEMENT_VEC_BINARY_OP int CV_CUDEV_IMPLEMENT_VEC_BINARY_OP uint CV_CUDEV_IMPLEMENT_VEC_BINARY_OP float CV_CUDEV_IMPLEMENT_VEC_BINARY_OP double int int uint double
Definition: vec_math.hpp:432