Point Cloud Library (PCL) 1.15.1-dev
Loading...
Searching...
No Matches
search.h
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2010-2011, Willow Garage, Inc.
6 * Copyright (c) 2012-, Open Perception, Inc.
7 *
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * * Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials provided
19 * with the distribution.
20 * * Neither the name of the copyright holder(s) nor the names of its
21 * contributors may be used to endorse or promote products derived
22 * from this software without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 *
37 */
38
39#pragma once
40
41#include <pcl/pcl_base.h> // for IndicesConstPtr
42#include <pcl/point_cloud.h>
43#include <pcl/for_each_type.h>
44#include <pcl/common/concatenate.h>
45#include <pcl/common/copy_point.h>
46
47namespace pcl
48{
49 // Forward declarations
50 template <typename T> class PointRepresentation;
51
52 namespace search
53 {
54 /** \brief Generic search class. All search wrappers must inherit from this.
55 *
56 * Each search method must implement 2 different types of search:
57 * - \b nearestKSearch - search for K-nearest neighbors.
58 * - \b radiusSearch - search for all nearest neighbors in a sphere of a given radius
59 *
60 * The input to each search method can be given in 3 different ways:
61 * - as a query point
62 * - as a (cloud, index) pair
63 * - as an index
64 *
65 * For the latter option, it is assumed that the user specified the input
66 * via a \ref setInputCloud () method first.
67 *
68 * \note In case of an error, all methods are supposed to return 0 as the number of neighbors found.
69 *
70 * \note libpcl_search deals with three-dimensional search problems. For higher
71 * level dimensional search, please refer to the libpcl_kdtree module.
72 *
73 * \author Radu B. Rusu
74 * \ingroup search
75 */
76 template<typename PointT>
77 class Search
78 {
79 public:
83
84 using Ptr = shared_ptr<pcl::search::Search<PointT> >;
85 using ConstPtr = shared_ptr<const pcl::search::Search<PointT> >;
86
89
90 using PointRepresentationConstPtr = shared_ptr<const PointRepresentation<PointT> >;
91
92 /** Constructor. */
93 Search (const std::string& name = "", bool sorted = false);
94
95 /** Destructor. */
96 virtual
97 ~Search () = default;
98
99 /** \brief Returns the search method name
100 */
101 virtual const std::string&
102 getName () const;
103
104 /** \brief sets whether the results should be sorted (ascending in the distance) or not
105 * \param[in] sorted should be true if the results should be sorted by the distance in ascending order.
106 * Otherwise the results may be returned in any order.
107 */
108 virtual void
109 setSortedResults (bool sorted);
110
111 /** \brief Gets whether the results should be sorted (ascending in the distance) or not
112 * Otherwise the results may be returned in any order.
113 */
114 virtual bool
116
117 /** \brief Provide a pointer to the point representation to use to convert points into
118 * k-D vectors. If you want to use this function, it is recommended to do so _before_
119 * calling setInputCloud. Some search methods will ignore this (e.g. octree or organized search).
120 * \param[in] point_representation the const shared pointer to a PointRepresentation
121 * \return True if success, false if a problem occurred or the search method will not use the point representation
122 */
123 virtual bool
125 {
126 return (false);
127 }
128
129 /** \brief Pass the input dataset that the search will be performed on.
130 * \param[in] cloud a const pointer to the PointCloud data
131 * \param[in] indices the point indices subset that is to be used from the cloud
132 * \return True if successful, false if an error occurred, for example because the point cloud is unsuited for the search method.
133 */
134 virtual bool
135 setInputCloud (const PointCloudConstPtr& cloud,
136 const IndicesConstPtr &indices = IndicesConstPtr ());
137
138 /** \brief Get a pointer to the input point cloud dataset. */
139 virtual PointCloudConstPtr
141 {
142 return (input_);
143 }
144
145 /** \brief Get a pointer to the vector of indices used. */
146 virtual IndicesConstPtr
147 getIndices () const
148 {
149 return (indices_);
150 }
151
152 /** \brief Search for the k-nearest neighbors for the given query point.
153 * \param[in] point the given query point
154 * \param[in] k the number of neighbors to search for
155 * \param[out] k_indices the resultant indices of the neighboring points (must be resized to \a k a priori!)
156 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points (must be resized to \a k
157 * a priori!)
158 * \return number of neighbors found
159 */
160 virtual int
161 nearestKSearch (const PointT &point, int k, Indices &k_indices,
162 std::vector<float> &k_sqr_distances) const = 0;
163
164 /** \brief Search for k-nearest neighbors for the given query point.
165 * This method accepts a different template parameter for the point type.
166 * \param[in] point the given query point
167 * \param[in] k the number of neighbors to search for
168 * \param[out] k_indices the resultant indices of the neighboring points (must be resized to \a k a priori!)
169 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points (must be resized to \a k
170 * a priori!)
171 * \return number of neighbors found
172 */
173 template <typename PointTDiff> inline int
174 nearestKSearchT (const PointTDiff &point, int k,
175 Indices &k_indices, std::vector<float> &k_sqr_distances) const
176 {
177 PointT p;
178 copyPoint (point, p);
179 return (nearestKSearch (p, k, k_indices, k_sqr_distances));
180 }
181
182 /** \brief Search for k-nearest neighbors for the given query point.
183 *
184 * \attention This method does not do any bounds checking for the input index
185 * (i.e., index >= cloud.size () || index < 0), and assumes valid (i.e., finite) data.
186 *
187 * \param[in] cloud the point cloud data
188 * \param[in] index a \a valid index in \a cloud representing a \a valid (i.e., finite) query point
189 * \param[in] k the number of neighbors to search for
190 * \param[out] k_indices the resultant indices of the neighboring points (must be resized to \a k a priori!)
191 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points (must be resized to \a k
192 * a priori!)
193 *
194 * \return number of neighbors found
195 *
196 * \exception asserts in debug mode if the index is not between 0 and the maximum number of points
197 */
198 virtual int
199 nearestKSearch (const PointCloud &cloud, index_t index, int k,
200 Indices &k_indices,
201 std::vector<float> &k_sqr_distances) const;
202
203 /** \brief Search for k-nearest neighbors for the given query point (zero-copy).
204 *
205 * \attention This method does not do any bounds checking for the input index
206 * (i.e., index >= cloud.size () || index < 0), and assumes valid (i.e., finite) data.
207 *
208 * \param[in] index a \a valid index representing a \a valid query point in the dataset given
209 * by \a setInputCloud. If indices were given in setInputCloud, index will be the position in
210 * the indices vector.
211 *
212 * \param[in] k the number of neighbors to search for
213 * \param[out] k_indices the resultant indices of the neighboring points (must be resized to \a k a priori!)
214 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points (must be resized to \a k
215 * a priori!)
216 * \return number of neighbors found
217 *
218 * \exception asserts in debug mode if the index is not between 0 and the maximum number of points
219 */
220 virtual int
221 nearestKSearch (index_t index, int k,
222 Indices &k_indices,
223 std::vector<float> &k_sqr_distances) const;
224
225 /** \brief Search for the k-nearest neighbors for the given query point.
226 * \param[in] cloud the point cloud data
227 * \param[in] indices a vector of point cloud indices to query for nearest neighbors
228 * \param[in] k the number of neighbors to search for
229 * \param[out] k_indices the resultant indices of the neighboring points, k_indices[i] corresponds to the neighbors of the query point i
230 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points, k_sqr_distances[i] corresponds to the neighbors of the query point i
231 */
232 virtual void
233 nearestKSearch (const PointCloud& cloud, const Indices& indices,
234 int k, std::vector<Indices>& k_indices,
235 std::vector< std::vector<float> >& k_sqr_distances) const;
236
237 /** \brief Search for the k-nearest neighbors for the given query point. Use this method if the query points are of a different type than the points in the data set (e.g. PointXYZRGBA instead of PointXYZ).
238 * \param[in] cloud the point cloud data
239 * \param[in] indices a vector of point cloud indices to query for nearest neighbors
240 * \param[in] k the number of neighbors to search for
241 * \param[out] k_indices the resultant indices of the neighboring points, k_indices[i] corresponds to the neighbors of the query point i
242 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points, k_sqr_distances[i] corresponds to the neighbors of the query point i
243 * \note This method copies the input point cloud of type PointTDiff to a temporary cloud of type PointT and performs the batch search on the new cloud. You should prefer the single-point search if you don't use a search algorithm that accelerates batch NN search.
244 */
245 template <typename PointTDiff> void
246 nearestKSearchT (const pcl::PointCloud<PointTDiff> &cloud, const Indices& indices, int k, std::vector<Indices> &k_indices,
247 std::vector< std::vector<float> > &k_sqr_distances) const
248 {
249 // Copy all the data fields from the input cloud to the output one
250 using FieldListInT = typename pcl::traits::fieldList<PointT>::type;
251 using FieldListOutT = typename pcl::traits::fieldList<PointTDiff>::type;
252 using FieldList = typename pcl::intersect<FieldListInT, FieldListOutT>::type;
253
255 if (indices.empty ())
256 {
257 pc.resize (cloud.size());
258 for (std::size_t i = 0; i < cloud.size(); i++)
259 {
260 pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (
261 cloud[i], pc[i]));
262 }
263 nearestKSearch (pc,Indices(),k,k_indices,k_sqr_distances);
264 }
265 else
266 {
267 pc.resize (indices.size());
268 for (std::size_t i = 0; i < indices.size(); i++)
269 {
270 pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (
271 cloud[indices[i]], pc[i]));
272 }
273 nearestKSearch (pc,Indices(),k,k_indices,k_sqr_distances);
274 }
275 }
276
277 /** \brief Search for all the nearest neighbors of the query point in a given radius.
278 * \param[in] point the given query point
279 * \param[in] radius the radius of the sphere bounding all of p_q's neighbors
280 * \param[out] k_indices the resultant indices of the neighboring points
281 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points
282 * \param[in] max_nn if given, bounds the maximum returned neighbors to this value. If \a max_nn is set to
283 * 0 or to a number higher than the number of points in the input cloud, all neighbors in \a radius will be
284 * returned.
285 * \return number of neighbors found in radius
286 */
287 virtual int
288 radiusSearch (const PointT& point, double radius, Indices& k_indices,
289 std::vector<float>& k_sqr_distances, unsigned int max_nn = 0) const = 0;
290
291 /** \brief Search for all the nearest neighbors of the query point in a given radius.
292 * \param[in] point the given query point
293 * \param[in] radius the radius of the sphere bounding all of p_q's neighbors
294 * \param[out] k_indices the resultant indices of the neighboring points
295 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points
296 * \param[in] max_nn if given, bounds the maximum returned neighbors to this value. If \a max_nn is set to
297 * 0 or to a number higher than the number of points in the input cloud, all neighbors in \a radius will be
298 * returned.
299 * \return number of neighbors found in radius
300 */
301 template <typename PointTDiff> inline int
302 radiusSearchT (const PointTDiff &point, double radius, Indices &k_indices,
303 std::vector<float> &k_sqr_distances, unsigned int max_nn = 0) const
304 {
305 PointT p;
306 copyPoint (point, p);
307 return (radiusSearch (p, radius, k_indices, k_sqr_distances, max_nn));
308 }
309
310 /** \brief Search for all the nearest neighbors of the query point in a given radius.
311 *
312 * \attention This method does not do any bounds checking for the input index
313 * (i.e., index >= cloud.size () || index < 0), and assumes valid (i.e., finite) data.
314 *
315 * \param[in] cloud the point cloud data
316 * \param[in] index a \a valid index in \a cloud representing a \a valid (i.e., finite) query point
317 * \param[in] radius the radius of the sphere bounding all of p_q's neighbors
318 * \param[out] k_indices the resultant indices of the neighboring points
319 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points
320 * \param[in] max_nn if given, bounds the maximum returned neighbors to this value. If \a max_nn is set to
321 * 0 or to a number higher than the number of points in the input cloud, all neighbors in \a radius will be
322 * returned.
323 * \return number of neighbors found in radius
324 *
325 * \exception asserts in debug mode if the index is not between 0 and the maximum number of points
326 */
327 virtual int
328 radiusSearch (const PointCloud &cloud, index_t index, double radius,
329 Indices &k_indices, std::vector<float> &k_sqr_distances,
330 unsigned int max_nn = 0) const;
331
332 /** \brief Search for all the nearest neighbors of the query point in a given radius (zero-copy).
333 *
334 * \attention This method does not do any bounds checking for the input index
335 * (i.e., index >= cloud.size () || index < 0), and assumes valid (i.e., finite) data.
336 *
337 * \param[in] index a \a valid index representing a \a valid query point in the dataset given
338 * by \a setInputCloud. If indices were given in setInputCloud, index will be the position in
339 * the indices vector.
340 *
341 * \param[in] radius the radius of the sphere bounding all of p_q's neighbors
342 * \param[out] k_indices the resultant indices of the neighboring points
343 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points
344 * \param[in] max_nn if given, bounds the maximum returned neighbors to this value. If \a max_nn is set to
345 * 0 or to a number higher than the number of points in the input cloud, all neighbors in \a radius will be
346 * returned.
347 * \return number of neighbors found in radius
348 *
349 * \exception asserts in debug mode if the index is not between 0 and the maximum number of points
350 */
351 virtual int
352 radiusSearch (index_t index, double radius, Indices &k_indices,
353 std::vector<float> &k_sqr_distances, unsigned int max_nn = 0) const;
354
355 /** \brief Search for all the nearest neighbors of the query point in a given radius.
356 * \param[in] cloud the point cloud data
357 * \param[in] indices the indices in \a cloud. If indices is empty, neighbors will be searched for all points.
358 * \param[in] radius the radius of the sphere bounding all of p_q's neighbors
359 * \param[out] k_indices the resultant indices of the neighboring points, k_indices[i] corresponds to the neighbors of the query point i
360 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points, k_sqr_distances[i] corresponds to the neighbors of the query point i
361 * \param[in] max_nn if given, bounds the maximum returned neighbors to this value. If \a max_nn is set to
362 * 0 or to a number higher than the number of points in the input cloud, all neighbors in \a radius will be
363 * returned.
364 */
365 virtual void
366 radiusSearch (const PointCloud& cloud,
367 const Indices& indices,
368 double radius,
369 std::vector<Indices>& k_indices,
370 std::vector< std::vector<float> > &k_sqr_distances,
371 unsigned int max_nn = 0) const;
372
373 /** \brief Search for all the nearest neighbors of the query points in a given radius.
374 * \param[in] cloud the point cloud data
375 * \param[in] indices a vector of point cloud indices to query for nearest neighbors
376 * \param[in] radius the radius of the sphere bounding all of p_q's neighbors
377 * \param[out] k_indices the resultant indices of the neighboring points, k_indices[i] corresponds to the neighbors of the query point i
378 * \param[out] k_sqr_distances the resultant squared distances to the neighboring points, k_sqr_distances[i] corresponds to the neighbors of the query point i
379 * \param[in] max_nn if given, bounds the maximum returned neighbors to this value. If \a max_nn is set to
380 * 0 or to a number higher than the number of points in the input cloud, all neighbors in \a radius will be
381 * returned.
382 * \note This method copies the input point cloud of type PointTDiff to a temporary cloud of type PointT and performs the batch search on the new cloud. You should prefer the single-point search if you don't use a search algorithm that accelerates batch NN search.
383 */
384 template <typename PointTDiff> void
386 const Indices& indices,
387 double radius,
388 std::vector<Indices> &k_indices,
389 std::vector< std::vector<float> > &k_sqr_distances,
390 unsigned int max_nn = 0) const
391 {
392 // Copy all the data fields from the input cloud to the output one
393 using FieldListInT = typename pcl::traits::fieldList<PointT>::type;
394 using FieldListOutT = typename pcl::traits::fieldList<PointTDiff>::type;
395 using FieldList = typename pcl::intersect<FieldListInT, FieldListOutT>::type;
396
398 if (indices.empty ())
399 {
400 pc.resize (cloud.size ());
401 for (std::size_t i = 0; i < cloud.size (); ++i)
402 pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (cloud[i], pc[i]));
403 radiusSearch (pc, Indices(), radius, k_indices, k_sqr_distances, max_nn);
404 }
405 else
406 {
407 pc.resize (indices.size ());
408 for (std::size_t i = 0; i < indices.size (); ++i)
409 pcl::for_each_type <FieldList> (pcl::NdConcatenateFunctor <PointTDiff, PointT> (cloud[indices[i]], pc[i]));
410 radiusSearch (pc, Indices(), radius, k_indices, k_sqr_distances, max_nn);
411 }
412 }
413
414 /** \brief Set the number of threads to use for searching over multiple points or indices
415 * \param[in] nr_threads the number of threads to use (0 automatically sets the threads based on the hardware)
416 */
417 void setNumberOfThreads(unsigned int nr_threads) {
418 #ifdef _OPENMP
419 num_threads_ = nr_threads != 0 ? nr_threads : omp_get_num_procs();
420 #else
421 if (nr_threads != 1) {
422 PCL_WARN("OpenMP is not available. Keeping number of threads unchanged at 1\n");
423 }
424 #endif
425 }
426
427 protected:
428 void
429 sortResults (Indices& indices, std::vector<float>& distances) const;
430
434 std::string name_;
435
436 /** \brief The number of threads to use when searching over multiple points or indices */
437 unsigned int num_threads_{1};
438
439 private:
440 struct Compare
441 {
442 Compare (const std::vector<float>& distances)
443 : distances_ (distances)
444 {
445 }
446
447 bool
448 operator () (index_t first, index_t second) const
449 {
450 return (distances_ [first] < distances_[second]);
451 }
452
453 const std::vector<float>& distances_;
454 };
455 }; // class Search
456 } // namespace search
457} // namespace pcl
458
459#ifdef PCL_NO_PRECOMPILE
460#include <pcl/search/impl/search.hpp>
461#endif
PointCloud represents the base class in PCL for storing collections of 3D points.
void resize(std::size_t count)
Resizes the container to contain count elements.
std::size_t size() const
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
Generic search class.
Definition search.h:78
shared_ptr< const pcl::search::Search< PointT > > ConstPtr
Definition search.h:85
virtual bool getSortedResults()
Gets whether the results should be sorted (ascending in the distance) or not Otherwise the results ma...
Definition search.hpp:68
virtual IndicesConstPtr getIndices() const
Get a pointer to the vector of indices used.
Definition search.h:147
void setNumberOfThreads(unsigned int nr_threads)
Set the number of threads to use for searching over multiple points or indices.
Definition search.h:417
PointCloudConstPtr input_
Definition search.h:431
unsigned int num_threads_
The number of threads to use when searching over multiple points or indices.
Definition search.h:437
virtual bool setPointRepresentation(const PointRepresentationConstPtr &)
Provide a pointer to the point representation to use to convert points into k-D vectors.
Definition search.h:124
void sortResults(Indices &indices, std::vector< float > &distances) const
Definition search.hpp:193
virtual const std::string & getName() const
Returns the search method name.
Definition search.hpp:54
void nearestKSearchT(const pcl::PointCloud< PointTDiff > &cloud, const Indices &indices, int k, std::vector< Indices > &k_indices, std::vector< std::vector< float > > &k_sqr_distances) const
Search for the k-nearest neighbors for the given query point.
Definition search.h:246
typename PointCloud::ConstPtr PointCloudConstPtr
Definition search.h:82
virtual bool setInputCloud(const PointCloudConstPtr &cloud, const IndicesConstPtr &indices=IndicesConstPtr())
Pass the input dataset that the search will be performed on.
Definition search.hpp:75
IndicesConstPtr indices_
Definition search.h:432
pcl::IndicesConstPtr IndicesConstPtr
Definition search.h:88
pcl::IndicesPtr IndicesPtr
Definition search.h:87
void radiusSearchT(const pcl::PointCloud< PointTDiff > &cloud, const Indices &indices, double radius, std::vector< Indices > &k_indices, std::vector< std::vector< float > > &k_sqr_distances, unsigned int max_nn=0) const
Search for all the nearest neighbors of the query points in a given radius.
Definition search.h:385
shared_ptr< pcl::search::Search< PointT > > Ptr
Definition search.h:84
shared_ptr< const PointRepresentation< PointT > > PointRepresentationConstPtr
Definition search.h:90
virtual PointCloudConstPtr getInputCloud() const
Get a pointer to the input point cloud dataset.
Definition search.h:140
int radiusSearchT(const PointTDiff &point, double radius, Indices &k_indices, std::vector< float > &k_sqr_distances, unsigned int max_nn=0) const
Search for all the nearest neighbors of the query point in a given radius.
Definition search.h:302
typename PointCloud::Ptr PointCloudPtr
Definition search.h:81
virtual int nearestKSearch(const PointT &point, int k, Indices &k_indices, std::vector< float > &k_sqr_distances) const =0
Search for the k-nearest neighbors for the given query point.
std::string name_
Definition search.h:434
virtual void setSortedResults(bool sorted)
sets whether the results should be sorted (ascending in the distance) or not
Definition search.hpp:61
virtual int radiusSearch(const PointT &point, double radius, Indices &k_indices, std::vector< float > &k_sqr_distances, unsigned int max_nn=0) const =0
Search for all the nearest neighbors of the query point in a given radius.
int nearestKSearchT(const PointTDiff &point, int k, Indices &k_indices, std::vector< float > &k_sqr_distances) const
Search for k-nearest neighbors for the given query point.
Definition search.h:174
virtual ~Search()=default
Destructor.
void copyPoint(const PointInT &point_in, PointOutT &point_out)
Copy the fields of a source point into a target point.
shared_ptr< const Indices > IndicesConstPtr
Definition pcl_base.h:59
detail::int_type_t< detail::index_type_size, detail::index_type_signed > index_t
Type used for an index in PCL.
Definition types.h:112
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition types.h:133
shared_ptr< Indices > IndicesPtr
Definition pcl_base.h:58
A point structure representing Euclidean xyz coordinates, and the RGB color.
typename boost::mpl::remove_if< Sequence1, boost::mpl::not_< boost::mpl::contains< Sequence2, boost::mpl::_1 > > >::type type