40#ifndef PCL_SEARCH_IMPL_FLANN_SEARCH_H_
41#define PCL_SEARCH_IMPL_FLANN_SEARCH_H_
43#include <flann/algorithms/kdtree_index.h>
44#include <flann/algorithms/kdtree_single_index.h>
45#include <flann/algorithms/kmeans_index.h>
47#include <pcl/search/flann_search.h>
48#include <pcl/kdtree/kdtree_flann.h>
50#include <pcl/kdtree/impl/kdtree_flann.hpp>
53template <
typename Po
intT,
typename FlannDistance>
57 return (
IndexPtr (
new flann::KDTreeSingleIndex<FlannDistance> (*data,flann::KDTreeSingleIndexParams (max_leaf_size_))));
61template <
typename Po
intT,
typename FlannDistance>
65 return (
IndexPtr (
new flann::KMeansIndex<FlannDistance> (*data,flann::KMeansIndexParams ())));
69template <
typename Po
intT,
typename FlannDistance>
73 return (
IndexPtr (
new flann::KDTreeIndex<FlannDistance> (*data, flann::KDTreeIndexParams (trees_))));
77template <
typename Po
intT,
typename FlannDistance>
86template <
typename Po
intT,
typename FlannDistance>
94template <
typename Po
intT,
typename FlannDistance>
void
105template <
typename Po
intT,
typename FlannDistance>
int
108 assert (
point_representation_->isValid (point) &&
"Invalid (NaN, Inf) point coordinates given to nearestKSearch!");
111 float* data =
nullptr;
118 float* cdata = can_cast ?
const_cast<float*
> (
reinterpret_cast<const float*
> (&point)): data;
121 flann::SearchParams p;
125 if (indices.size() !=
static_cast<unsigned int> (k))
126 indices.resize (k,-1);
127 if (dists.size() !=
static_cast<unsigned int> (k))
136 for (std::size_t i = 0; i < static_cast<unsigned int> (k); ++i)
138 auto& neighbor_index = indices[i];
146template <
typename Po
intT,
typename FlannDistance>
void
148 const PointCloud& cloud,
const Indices& indices,
int k, std::vector<Indices>& k_indices,
149 std::vector< std::vector<float> >& k_sqr_distances)
const
151 if (indices.empty ())
153 k_indices.resize (cloud.size ());
154 k_sqr_distances.resize (cloud.size ());
156 if (! cloud.is_dense)
158 for (std::size_t i = 0; i < cloud.size(); i++)
160 assert (
point_representation_->isValid (cloud[i]) &&
"Invalid (NaN, Inf) point coordinates given to nearestKSearch!");
170 data =
new float[
dim_*cloud.size ()];
171 for (std::size_t i = 0; i < cloud.size (); ++i)
173 float* out = data+i*
dim_;
180 float* cdata = can_cast ?
const_cast<float*
> (
reinterpret_cast<const float*
> (&cloud[0])): data;
183 flann::SearchParams p;
193 k_indices.resize (indices.size ());
194 k_sqr_distances.resize (indices.size ());
196 if (! cloud.is_dense)
198 for (std::size_t i = 0; i < indices.size(); i++)
200 assert (
point_representation_->isValid (cloud [indices[i]]) &&
"Invalid (NaN, Inf) point coordinates given to nearestKSearch!");
204 float* data=
new float [
dim_*indices.size ()];
205 for (std::size_t i = 0; i < indices.size (); ++i)
207 float* out = data+i*
dim_;
212 flann::SearchParams p;
222 for (
auto &k_index : k_indices)
224 for (
auto &neighbor_index : k_index)
233template <
typename Po
intT,
typename FlannDistance>
int
236 unsigned int max_nn)
const
238 assert (
point_representation_->isValid (point) &&
"Invalid (NaN, Inf) point coordinates given to radiusSearch!");
241 float* data =
nullptr;
248 float* cdata = can_cast ?
const_cast<float*
> (
reinterpret_cast<const float*
> (&point)) : data;
251 flann::SearchParams p;
254 p.max_neighbors = max_nn > 0 ? max_nn : -1;
256 std::vector<Indices> i (1);
257 std::vector<std::vector<float> > d (1);
266 for (
auto &neighbor_index : indices)
275template <
typename Po
intT,
typename FlannDistance>
void
277 const PointCloud& cloud,
const Indices& indices,
double radius, std::vector<Indices>& k_indices,
278 std::vector< std::vector<float> >& k_sqr_distances,
unsigned int max_nn)
const
280 if (indices.empty ())
282 k_indices.resize (cloud.size ());
283 k_sqr_distances.resize (cloud.size ());
285 if (! cloud.is_dense)
287 for (std::size_t i = 0; i < cloud.size(); i++)
289 assert (
point_representation_->isValid (cloud[i]) &&
"Invalid (NaN, Inf) point coordinates given to radiusSearch!");
295 float* data =
nullptr;
298 data =
new float[
dim_*cloud.size ()];
299 for (std::size_t i = 0; i < cloud.size (); ++i)
301 float* out = data+i*
dim_;
306 float* cdata = can_cast ?
const_cast<float*
> (
reinterpret_cast<const float*
> (&cloud[0])) : data;
309 flann::SearchParams p;
314 p.max_neighbors = max_nn != 0 ? max_nn : -1;
316 *
index_, m, k_indices, k_sqr_distances,
static_cast<float>(radius * radius), p);
322 k_indices.resize (indices.size ());
323 k_sqr_distances.resize (indices.size ());
325 if (! cloud.is_dense)
327 for (std::size_t i = 0; i < indices.size(); i++)
329 assert (
point_representation_->isValid (cloud [indices[i]]) &&
"Invalid (NaN, Inf) point coordinates given to radiusSearch!");
333 float* data =
new float [
dim_ * indices.size ()];
334 for (std::size_t i = 0; i < indices.size (); ++i)
336 float* out = data+i*
dim_;
341 flann::SearchParams p;
346 p.max_neighbors = max_nn != 0 ? max_nn : -1;
348 *
index_, m, k_indices, k_sqr_distances,
static_cast<float>(radius * radius), p);
354 for (
auto &k_index : k_indices)
356 for (
auto &neighbor_index : k_index)
365template <
typename Po
intT,
typename FlannDistance>
void
393 for (std::size_t i = 0; i < original_no_of_points; ++i)
395 const PointT& point = (*input_)[i];
415 for (std::size_t indices_index = 0; indices_index < original_no_of_points; ++indices_index)
417 index_t cloud_index = (*indices_)[indices_index];
418 const PointT& point = (*input_)[cloud_index];
436#define PCL_INSTANTIATE_FlannSearch(T) template class PCL_EXPORTS pcl::search::FlannSearch<T>;
DefaultPointRepresentation extends PointRepresentation to define default behavior for common point ty...
virtual IndexPtr createIndex(MatrixConstPtr data)
Create a FLANN Index from the input data.
IndexPtr createIndex(MatrixConstPtr data) override
Create a FLANN Index from the input data.
virtual IndexPtr createIndex(MatrixConstPtr data)
Create a FLANN Index from the input data.
void setInputCloud(const PointCloudConstPtr &cloud, const IndicesConstPtr &indices=IndicesConstPtr()) override
Provide a pointer to the input dataset.
void convertInputToFlannMatrix()
converts the input data to a format usable by FLANN
int radiusSearch(const PointT &point, double radius, Indices &k_indices, std::vector< float > &k_sqr_distances, unsigned int max_nn=0) const override
Search for all the nearest neighbors of the query point in a given radius.
shared_ptr< flann::NNIndex< FlannDistance > > IndexPtr
int checks_
Number of checks to perform for approximate NN search using the multiple randomized tree index.
shared_ptr< const flann::Matrix< float > > MatrixConstPtr
FlannSearch(bool sorted=true, FlannIndexCreatorPtr creator=FlannIndexCreatorPtr(new KdTreeIndexCreator()))
MatrixPtr input_flann_
Input data in FLANN format.
PointRepresentationConstPtr point_representation_
shared_ptr< FlannIndexCreator > FlannIndexCreatorPtr
int nearestKSearch(const PointT &point, int k, Indices &k_indices, std::vector< float > &k_sqr_distances) const override
Search for the k-nearest neighbors for the given query point.
typename Search< PointT >::PointCloudConstPtr PointCloudConstPtr
typename Search< PointT >::PointCloud PointCloud
FlannIndexCreatorPtr creator_
The index creator, used to (re-) create the index when the search data is passed.
IndexPtr index_
The FLANN index.
bool input_copied_for_flann_
float eps_
Epsilon for approximate NN search.
shared_ptr< flann::Matrix< float > > MatrixPtr
~FlannSearch()
Destructor for FlannSearch.
PointCloudConstPtr input_
Search(const std::string &name="", bool sorted=false)
Constructor.
pcl::IndicesConstPtr IndicesConstPtr
detail::int_type_t< detail::index_type_size, detail::index_type_signed > index_t
Type used for an index in PCL.
IndicesAllocator<> Indices
Type used for indices in PCL.
int radius_search(const FlannIndex &index, const Query &query, Indices &indices, Distances &dists, float radius, const SearchParams ¶ms)
Comaptibility template function to allow use of various types of indices with FLANN.
int knn_search(const FlannIndex &index, const Query &query, Indices &indices, Distances &dists, unsigned int k, const SearchParams ¶ms)
Comaptibility template function to allow use of various types of indices with FLANN.