38 #ifndef PCL_KDTREE_KDTREE_IMPL_FLANN_H_
39 #define PCL_KDTREE_KDTREE_IMPL_FLANN_H_
45 template <
typename Po
intT,
typename Dist>
void
51 dim_ = point_representation_->getNumberOfDimensions ();
59 PCL_ERROR (
"[pcl::KdTreeFLANN::setInputCloud] Invalid input!\n");
64 convertCloudToArray (*input_, *indices_);
68 convertCloudToArray (*input_);
70 total_nr_points_ =
static_cast<int> (index_mapping_.size ());
73 flann::KDTreeSingleIndexParams (15));
74 flann_index_->buildIndex ();
78 template <
typename Po
intT,
typename Dist>
int
80 std::vector<int> &k_indices,
81 std::vector<float> &k_distances)
const
83 assert (point_representation_->isValid (point) &&
"Invalid (NaN, Inf) point coordinates given to nearestKSearch!");
85 if (k > total_nr_points_)
89 k_distances.resize (k);
91 std::vector<float> query (dim_);
92 point_representation_->vectorize (static_cast<PointT> (point), query);
98 k_indices_mat, k_distances_mat,
102 if (!identity_mapping_)
104 for (
size_t i = 0; i < static_cast<size_t> (k); ++i)
106 int& neighbor_index = k_indices[i];
107 neighbor_index = index_mapping_[neighbor_index];
115 template <
typename Po
intT,
typename Dist>
int
117 std::vector<float> &k_sqr_dists,
unsigned int max_nn)
const
119 assert (point_representation_->isValid (point) &&
"Invalid (NaN, Inf) point coordinates given to radiusSearch!");
121 std::vector<float> query (dim_);
122 point_representation_->vectorize (static_cast<PointT> (point), query);
125 if (max_nn == 0 || max_nn > static_cast<unsigned int> (total_nr_points_))
126 max_nn = total_nr_points_;
128 std::vector<std::vector<int> > indices(1);
129 std::vector<std::vector<float> > dists(1);
131 flann::SearchParams params(param_radius_);
132 if (max_nn == static_cast<unsigned int>(total_nr_points_))
133 params.max_neighbors = -1;
135 params.max_neighbors = max_nn;
137 int neighbors_in_radius = flann_index_->radiusSearch (
flann::Matrix<float> (&query[0], 1, dim_),
140 static_cast<float> (radius * radius),
143 k_indices = indices[0];
144 k_sqr_dists = dists[0];
147 if (!identity_mapping_)
149 for (
int i = 0; i < neighbors_in_radius; ++i)
151 int& neighbor_index = k_indices[i];
152 neighbor_index = index_mapping_[neighbor_index];
156 return (neighbors_in_radius);
160 template <
typename Po
intT,
typename Dist>
void
172 index_mapping_.clear ();
179 template <
typename Po
intT,
typename Dist>
void
183 if (cloud.
points.empty ())
189 int original_no_of_points =
static_cast<int> (cloud.
points.size ());
191 cloud_ =
static_cast<float*
> (malloc (original_no_of_points * dim_ *
sizeof (
float)));
192 float* cloud_ptr = cloud_;
193 index_mapping_.reserve (original_no_of_points);
194 identity_mapping_ =
true;
196 for (
int cloud_index = 0; cloud_index < original_no_of_points; ++cloud_index)
199 if (!point_representation_->isValid (cloud.
points[cloud_index]))
201 identity_mapping_ =
false;
205 index_mapping_.push_back (cloud_index);
207 point_representation_->vectorize (cloud.
points[cloud_index], cloud_ptr);
213 template <
typename Po
intT,
typename Dist>
void
217 if (cloud.
points.empty ())
223 int original_no_of_points =
static_cast<int> (indices.size ());
225 cloud_ =
static_cast<float*
> (malloc (original_no_of_points * dim_ *
sizeof (
float)));
226 float* cloud_ptr = cloud_;
227 index_mapping_.reserve (original_no_of_points);
235 identity_mapping_ =
false;
237 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
240 if (!point_representation_->isValid (cloud.
points[*iIt]))
244 index_mapping_.push_back (*iIt);
246 point_representation_->vectorize (cloud.
points[*iIt], cloud_ptr);
251 #define PCL_INSTANTIATE_KdTreeFLANN(T) template class PCL_EXPORTS pcl::KdTreeFLANN<T>;
253 #endif //#ifndef _PCL_KDTREE_KDTREE_IMPL_FLANN_H_