43
#ifndef OPENCV_FLANN_HPP
44
#define OPENCV_FLANN_HPP
46
#include "opencv2/core.hpp"
47
#include "opencv2/flann/miniflann.hpp"
48
#include "opencv2/flann/flann_base.hpp"
61
CV_EXPORTS flann_distance_t flann_distance_type();
62
CV_DEPRECATED CV_EXPORTS
void
set_distance_type(flann_distance_t distance_type,
int
order);
75
template
<
typename
T>
struct
CvType
{};
76
template
<>
struct
CvType<unsigned char> {
static
int
type() {
return
CV_8U; } };
77
template
<>
struct
CvType<char> {
static
int
type() {
return
CV_8S; } };
78
template
<>
struct
CvType<unsigned short> {
static
int
type() {
return
CV_16U; } };
79
template
<>
struct
CvType<short> {
static
int
type() {
return
CV_16S; } };
80
template
<>
struct
CvType<int> {
static
int
type() {
return
CV_32S; } };
81
template
<>
struct
CvType<float> {
static
int
type() {
return
CV_32F; } };
82
template
<>
struct
CvType<double> {
static
int
type() {
return
CV_64F; } };
86using ::cvflann::get_param;
87using ::cvflann::print_params;
90using ::cvflann::L2_Simple;
93using ::cvflann::MinkowskiDistance;
94using ::cvflann::MaxDistance;
95using ::cvflann::HammingLUT;
96using ::cvflann::Hamming;
97using ::cvflann::Hamming2;
98using ::cvflann::DNAmmingLUT;
99using ::cvflann::DNAmming2;
100using ::cvflann::HistIntersectionDistance;
101using ::cvflann::HellingerDistance;
102using ::cvflann::ChiSquareDistance;
103using ::cvflann::KL_Divergence;
169
template
<
typename
Distance>
173
typedef
typename
Distance::ElementType ElementType;
174
typedef
typename
Distance::ResultType DistanceType;
286
GenericIndex(
const
Mat& features, const ::cvflann::IndexParams& params, Distance distance = Distance());
300
void
knnSearch(
const
std::vector<ElementType>& query, std::vector<int>& indices,
301
std::vector<DistanceType>& dists,
int
knn, const ::cvflann::SearchParams& params);
302
void
knnSearch(
const
Mat& queries,
Mat& indices,
Mat& dists,
int
knn, const ::cvflann::SearchParams& params);
315
int
radiusSearch(
const
std::vector<ElementType>& query, std::vector<int>& indices,
316
std::vector<DistanceType>& dists, DistanceType radius, const ::cvflann::SearchParams& params);
318
DistanceType radius, const ::cvflann::SearchParams& params);
320
void
save(String filename) { nnIndex->save(filename); }
322
int
veclen()
const
{
return
nnIndex->veclen(); }
324
int
size()
const
{
return
(
int)nnIndex->size(); }
326
::cvflann::IndexParams getParameters() {
return
nnIndex->getParameters(); }
328
CV_DEPRECATED const ::cvflann::IndexParams* getIndexParameters() {
return
nnIndex->getIndexParameters(); }
331
::cvflann::Index<Distance>* nnIndex;
337
#define FLANN_DISTANCE_CHECK \
338
if ( ::cvflann::flann_distance_type() != cvflann::FLANN_DIST_L2) { \
339
printf("[WARNING] You are using cv::flann::Index (or cv::flann::GenericIndex) and have also changed "\
340
"the distance using cvflann::set_distance_type. This is no longer working as expected "\
341
"(cv::flann::Index always uses L2). You should create the index templated on the distance, "\
342
"for example for L1 distance use: GenericIndex< L1<float> > \n"); \
346
template
<
typename
Distance>
350
CV_Assert(dataset.type() == CvType<ElementType>::type());
352
::cvflann::Matrix<ElementType> m_dataset((ElementType*)_dataset.
ptr<ElementType>(0), _dataset.
rows, _dataset.cols);
354
nnIndex = new ::cvflann::Index<Distance>(m_dataset, params, distance);
358
nnIndex->buildIndex();
361
template
<
typename
Distance>
362GenericIndex<Distance>::~GenericIndex()
367
template
<
typename
Distance>
368
void
GenericIndex<Distance>::knnSearch(
const
std::vector<ElementType>& query, std::vector<int>& indices, std::vector<DistanceType>& dists,
int
knn, const ::cvflann::SearchParams& searchParams)
370
::cvflann::Matrix<ElementType> m_query((ElementType*)&query[0], 1, query.size());
371
::cvflann::Matrix<int> m_indices(&indices[0], 1, indices.size());
372
::cvflann::Matrix<DistanceType> m_dists(&dists[0], 1, dists.size());
376
nnIndex->knnSearch(m_query,m_indices,m_dists,knn,searchParams);
380
template
<
typename
Distance>
383
CV_Assert(queries.type() == CvType<ElementType>::type());
385
::cvflann::Matrix<ElementType> m_queries((ElementType*)queries.ptr<ElementType>(0), queries.rows, queries.cols);
389
::cvflann::Matrix<int> m_indices((
int*)indices.ptr<
int>(0), indices.rows, indices.cols);
391
CV_Assert(dists.type() == CvType<DistanceType>::type());
393
::cvflann::Matrix<DistanceType> m_dists((DistanceType*)dists.ptr<DistanceType>(0), dists.rows, dists.cols);
397
nnIndex->knnSearch(m_queries,m_indices,m_dists,knn, searchParams);
400
template
<
typename
Distance>
401
int
GenericIndex<Distance>::radiusSearch(
const
std::vector<ElementType>& query, std::vector<int>& indices, std::vector<DistanceType>& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams)
403
::cvflann::Matrix<ElementType> m_query((ElementType*)&query[0], 1, query.size());
404
::cvflann::Matrix<int> m_indices(&indices[0], 1, indices.size());
405
::cvflann::Matrix<DistanceType> m_dists(&dists[0], 1, dists.size());
409
return
nnIndex->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
412
template
<
typename
Distance>
415
CV_Assert(query.type() == CvType<ElementType>::type());
417
::cvflann::Matrix<ElementType> m_query((ElementType*)query.ptr<ElementType>(0), query.rows, query.cols);
421
::cvflann::Matrix<int> m_indices((
int*)indices.ptr<
int>(0), indices.rows, indices.cols);
423
CV_Assert(dists.type() == CvType<DistanceType>::type());
425
::cvflann::Matrix<DistanceType> m_dists((DistanceType*)dists.ptr<DistanceType>(0), dists.rows, dists.cols);
429
return
nnIndex->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
435
template
<
typename
T>
439
typedef
typename
L2<T>::ElementType ElementType;
440
typedef
typename
L2<T>::ResultType DistanceType;
442
CV_DEPRECATED Index_(
const
Mat& dataset, const ::cvflann::IndexParams& params)
444
printf(
"[WARNING] The cv::flann::Index_<T> class is deperecated, use cv::flann::GenericIndex<Distance> instead\n");
446
CV_Assert(dataset.type() == CvType<ElementType>::type());
448
::cvflann::Matrix<ElementType> m_dataset((ElementType*)dataset.ptr<ElementType>(0), dataset.rows, dataset.cols);
450
if
( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L2 ) {
452
nnIndex_L2 = new ::cvflann::Index< L2<ElementType> >(m_dataset, params);
454
else
if
( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L1 ) {
455
nnIndex_L1 = new ::cvflann::Index< L1<ElementType> >(m_dataset, params);
459
printf(
"[ERROR] cv::flann::Index_<T> only provides backwards compatibility for the L1 and L2 distances. "
460
"For other distance types you must use cv::flann::GenericIndex<Distance>\n");
463
if
(nnIndex_L1) nnIndex_L1->buildIndex();
464
if
(nnIndex_L2) nnIndex_L2->buildIndex();
466
CV_DEPRECATED ~Index_()
468
if
(nnIndex_L1)
delete
nnIndex_L1;
469
if
(nnIndex_L2)
delete
nnIndex_L2;
472
CV_DEPRECATED
void
knnSearch(
const
std::vector<ElementType>& query, std::vector<int>& indices, std::vector<DistanceType>& dists,
int
knn, const ::cvflann::SearchParams& searchParams)
474
::cvflann::Matrix<ElementType> m_query((ElementType*)&query[0], 1, query.size());
475
::cvflann::Matrix<int> m_indices(&indices[0], 1, indices.size());
476
::cvflann::Matrix<DistanceType> m_dists(&dists[0], 1, dists.size());
478
if
(nnIndex_L1) nnIndex_L1->knnSearch(m_query,m_indices,m_dists,knn,searchParams);
479
if
(nnIndex_L2) nnIndex_L2->knnSearch(m_query,m_indices,m_dists,knn,searchParams);
481
CV_DEPRECATED
void
knnSearch(
const
Mat& queries, Mat& indices, Mat& dists,
int
knn, const ::cvflann::SearchParams& searchParams)
483
CV_Assert(queries.type() == CvType<ElementType>::type());
485
::cvflann::Matrix<ElementType> m_queries((ElementType*)queries.ptr<ElementType>(0), queries.rows, queries.cols);
489
::cvflann::Matrix<int> m_indices((
int*)indices.ptr<
int>(0), indices.rows, indices.cols);
491
CV_Assert(dists.type() == CvType<DistanceType>::type());
493
::cvflann::Matrix<DistanceType> m_dists((DistanceType*)dists.ptr<DistanceType>(0), dists.rows, dists.cols);
495
if
(nnIndex_L1) nnIndex_L1->knnSearch(m_queries,m_indices,m_dists,knn, searchParams);
496
if
(nnIndex_L2) nnIndex_L2->knnSearch(m_queries,m_indices,m_dists,knn, searchParams);
499
CV_DEPRECATED
int
radiusSearch(
const
std::vector<ElementType>& query, std::vector<int>& indices, std::vector<DistanceType>& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams)
501
::cvflann::Matrix<ElementType> m_query((ElementType*)&query[0], 1, query.size());
502
::cvflann::Matrix<int> m_indices(&indices[0], 1, indices.size());
503
::cvflann::Matrix<DistanceType> m_dists(&dists[0], 1, dists.size());
505
if
(nnIndex_L1)
return
nnIndex_L1->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
506
if
(nnIndex_L2)
return
nnIndex_L2->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
509
CV_DEPRECATED
int
radiusSearch(
const
Mat& query, Mat& indices, Mat& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams)
511
CV_Assert(query.type() == CvType<ElementType>::type());
513
::cvflann::Matrix<ElementType> m_query((ElementType*)query.ptr<ElementType>(0), query.rows, query.cols);
517
::cvflann::Matrix<int> m_indices((
int*)indices.ptr<
int>(0), indices.rows, indices.cols);
519
CV_Assert(dists.type() == CvType<DistanceType>::type());
521
::cvflann::Matrix<DistanceType> m_dists((DistanceType*)dists.ptr<DistanceType>(0), dists.rows, dists.cols);
523
if
(nnIndex_L1)
return
nnIndex_L1->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
524
if
(nnIndex_L2)
return
nnIndex_L2->radiusSearch(m_query,m_indices,m_dists,radius,searchParams);
527
CV_DEPRECATED
void
save(String filename)
529
if
(nnIndex_L1) nnIndex_L1->save(filename);
530
if
(nnIndex_L2) nnIndex_L2->save(filename);
533
CV_DEPRECATED
int
veclen()
const
535
if
(nnIndex_L1)
return
nnIndex_L1->veclen();
536
if
(nnIndex_L2)
return
nnIndex_L2->veclen();
539
CV_DEPRECATED
int
size()
const
541
if
(nnIndex_L1)
return
nnIndex_L1->size();
542
if
(nnIndex_L2)
return
nnIndex_L2->size();
545
CV_DEPRECATED ::cvflann::IndexParams getParameters()
547
if
(nnIndex_L1)
return
nnIndex_L1->getParameters();
548
if
(nnIndex_L2)
return
nnIndex_L2->getParameters();
552
CV_DEPRECATED const ::cvflann::IndexParams* getIndexParameters()
554
if
(nnIndex_L1)
return
nnIndex_L1->getIndexParameters();
555
if
(nnIndex_L2)
return
nnIndex_L2->getIndexParameters();
560
::cvflann::Index< L2<ElementType> >* nnIndex_L2;
561
::cvflann::Index< L1<ElementType> >* nnIndex_L1;
583
template
<
typename
Distance>
585
Distance d = Distance())
587
typedef
typename
Distance::ElementType ElementType;
588
typedef
typename
Distance::CentersType CentersType;
592
::cvflann::Matrix<ElementType> m_features((ElementType*)features.ptr<ElementType>(0), features.rows, features.cols);
596
::cvflann::Matrix<CentersType> m_centers((CentersType*)centers.
ptr<CentersType>(0), centers.
rows, centers.cols);
598
return ::cvflann::hierarchicalClustering<Distance>(m_features, m_centers, params, d);
603
template
<
typename
ELEM_TYPE,
typename
DIST_TYPE>
606
printf(
"[WARNING] cv::flann::hierarchicalClustering<ELEM_TYPE,DIST_TYPE> is deprecated, use "
607
"cv::flann::hierarchicalClustering<Distance> instead\n");
609
if
( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L2 ) {
610
return
hierarchicalClustering< L2<ELEM_TYPE> >(features, centers, params);
612
else
if
( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L1 ) {
613
return
hierarchicalClustering< L1<ELEM_TYPE> >(features, centers, params);
616
printf(
"[ERROR] cv::flann::hierarchicalClustering<ELEM_TYPE,DIST_TYPE> only provides backwards "
617
"compatibility for the L1 and L2 distances. "
618
"For other distance types you must use cv::flann::hierarchicalClustering<Distance>\n");
n-dimensional dense array class
Definition:
mat.hpp:802
uchar * ptr(int i0=0)
Returns a pointer to the specified matrix row.
bool isContinuous() const
Reports whether the matrix is continuous or not.
int rows
the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions
Definition:
mat.hpp:2107
int type() const
Returns the type of a matrix element.
The FLANN nearest neighbor index class. This class is templated with the type of elements for which t...
Definition:
flann.hpp:171
void knnSearch(const std::vector< ElementType > &query, std::vector< int > &indices, std::vector< DistanceType > &dists, int knn, const ::cvflann::SearchParams ¶ms)
Performs a K-nearest neighbor search for a given query point using the index.
GenericIndex(const Mat &features, const ::cvflann::IndexParams ¶ms, Distance distance=Distance())
Constructs a nearest neighbor search index for a given dataset.
int radiusSearch(const std::vector< ElementType > &query, std::vector< int > &indices, std::vector< DistanceType > &dists, DistanceType radius, const ::cvflann::SearchParams ¶ms)
Performs a radius nearest neighbor search for a given query point using the index.
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails
Definition:
base.hpp:342
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
"black box" representation of the file storage associated with a file on disk.
Definition:
aruco.hpp:75