Point Cloud Library (PCL)  1.10.1-dev
radius_outlier_removal.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2010-2012, Willow Garage, Inc.
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * * Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above
16  * copyright notice, this list of conditions and the following
17  * disclaimer in the documentation and/or other materials provided
18  * with the distribution.
19  * * Neither the name of the copyright holder(s) nor the names of its
20  * contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * $Id$
37  *
38  */
39 
40 #pragma once
41 
42 #include <pcl/filters/filter_indices.h>
43 #include <pcl/search/pcl_search.h>
44 
45 namespace pcl
46 {
47  /** \brief @b RadiusOutlierRemoval filters points in a cloud based on the number of neighbors they have.
48  * \details Iterates through the entire input once, and for each point, retrieves the number of neighbors within a certain radius.
49  * The point will be considered an outlier if it has too few neighbors, as determined by setMinNeighborsInRadius().
50  * The radius can be changed using setRadiusSearch().
51  * <br>
52  * The neighbors found for each query point will be found amongst ALL points of setInputCloud(), not just those indexed by setIndices().
53  * The setIndices() method only indexes the points that will be iterated through as search query points.
54  * <br><br>
55  * Usage example:
56  * \code
57  * pcl::RadiusOutlierRemoval<PointType> rorfilter (true); // Initializing with true will allow us to extract the removed indices
58  * rorfilter.setInputCloud (cloud_in);
59  * rorfilter.setRadiusSearch (0.1);
60  * rorfilter.setMinNeighborsInRadius (5);
61  * rorfilter.setNegative (true);
62  * rorfilter.filter (*cloud_out);
63  * // The resulting cloud_out contains all points of cloud_in that have 4 or less neighbors within the 0.1 search radius
64  * indices_rem = rorfilter.getRemovedIndices ();
65  * // The indices_rem array indexes all points of cloud_in that have 5 or more neighbors within the 0.1 search radius
66  * \endcode
67  * \author Radu Bogdan Rusu
68  * \ingroup filters
69  */
70  template<typename PointT>
71  class RadiusOutlierRemoval : public FilterIndices<PointT>
72  {
73  protected:
75  using PointCloudPtr = typename PointCloud::Ptr;
78 
79  public:
80 
83 
84 
85  /** \brief Constructor.
86  * \param[in] extract_removed_indices Set to true if you want to be able to extract the indices of points being removed (default = false).
87  */
88  RadiusOutlierRemoval (bool extract_removed_indices = false) :
89  FilterIndices<PointT> (extract_removed_indices),
90  searcher_ (),
91  search_radius_ (0.0),
92  min_pts_radius_ (1)
93  {
94  filter_name_ = "RadiusOutlierRemoval";
95  }
96 
97  /** \brief Set the radius of the sphere that will determine which points are neighbors.
98  * \details The number of points within this distance from the query point will need to be equal or greater
99  * than setMinNeighborsInRadius() in order to be classified as an inlier point (i.e. will not be filtered).
100  * \param[in] radius The radius of the sphere for nearest neighbor searching.
101  */
102  inline void
103  setRadiusSearch (double radius)
104  {
105  search_radius_ = radius;
106  }
107 
108  /** \brief Get the radius of the sphere that will determine which points are neighbors.
109  * \details The number of points within this distance from the query point will need to be equal or greater
110  * than setMinNeighborsInRadius() in order to be classified as an inlier point (i.e. will not be filtered).
111  * \return The radius of the sphere for nearest neighbor searching.
112  */
113  inline double
115  {
116  return (search_radius_);
117  }
118 
119  /** \brief Set the number of neighbors that need to be present in order to be classified as an inlier.
120  * \details The number of points within setRadiusSearch() from the query point will need to be equal or greater
121  * than this number in order to be classified as an inlier point (i.e. will not be filtered).
122  * \param min_pts The minimum number of neighbors (default = 1).
123  */
124  inline void
126  {
127  min_pts_radius_ = min_pts;
128  }
129 
130  /** \brief Get the number of neighbors that need to be present in order to be classified as an inlier.
131  * \details The number of points within setRadiusSearch() from the query point will need to be equal or greater
132  * than this number in order to be classified as an inlier point (i.e. will not be filtered).
133  * \return The minimum number of neighbors (default = 1).
134  */
135  inline int
137  {
138  return (min_pts_radius_);
139  }
140 
141  protected:
151 
152  /** \brief Filtered results are indexed by an indices array.
153  * \param[out] indices The resultant indices.
154  */
155  void
156  applyFilter (std::vector<int> &indices) override
157  {
158  applyFilterIndices (indices);
159  }
160 
161  /** \brief Filtered results are indexed by an indices array.
162  * \param[out] indices The resultant indices.
163  */
164  void
165  applyFilterIndices (std::vector<int> &indices);
166 
167  private:
168  /** \brief A pointer to the spatial search object. */
169  SearcherPtr searcher_;
170 
171  /** \brief The nearest neighbors search radius for each point. */
172  double search_radius_;
173 
174  /** \brief The minimum number of neighbors that a point needs to have in the given search radius to be considered an inlier. */
175  int min_pts_radius_;
176  };
177 
178  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
179  /** \brief @b RadiusOutlierRemoval is a simple filter that removes outliers if the number of neighbors in a certain
180  * search radius is smaller than a given K.
181  * \note setFilterFieldName (), setFilterLimits (), and setFilterLimitNegative () are ignored.
182  * \author Radu Bogdan Rusu
183  * \ingroup filters
184  */
185  template<>
186  class PCL_EXPORTS RadiusOutlierRemoval<pcl::PCLPointCloud2> : public FilterIndices<pcl::PCLPointCloud2>
187  {
190 
193 
195  using KdTreePtr = pcl::search::Search<pcl::PointXYZ>::Ptr;
196 
200 
201  public:
202  /** \brief Empty constructor. */
203  RadiusOutlierRemoval (bool extract_removed_indices = false) :
204  FilterIndices<pcl::PCLPointCloud2>::FilterIndices (extract_removed_indices),
205  search_radius_ (0.0), min_pts_radius_ (1)
206  {
207  filter_name_ = "RadiusOutlierRemoval";
208  }
209 
210  /** \brief Set the sphere radius that is to be used for determining the k-nearest neighbors for filtering.
211  * \param radius the sphere radius that is to contain all k-nearest neighbors
212  */
213  inline void
214  setRadiusSearch (double radius)
215  {
216  search_radius_ = radius;
217  }
218 
219  /** \brief Get the sphere radius used for determining the k-nearest neighbors. */
220  inline double
222  {
223  return (search_radius_);
224  }
225 
226  /** \brief Set the minimum number of neighbors that a point needs to have in the given search radius in order to
227  * be considered an inlier (i.e., valid).
228  * \param min_pts the minimum number of neighbors
229  */
230  inline void
232  {
233  min_pts_radius_ = min_pts;
234  }
235 
236  /** \brief Get the minimum number of neighbors that a point needs to have in the given search radius to be
237  * considered an inlier and avoid being filtered.
238  */
239  inline double
241  {
242  return (min_pts_radius_);
243  }
244 
245  protected:
246  /** \brief The nearest neighbors search radius for each point. */
248 
249  /** \brief The minimum number of neighbors that a point needs to have in the given search radius to be considered
250  * an inlier.
251  */
253 
254  /** \brief A pointer to the spatial search object. */
255  KdTreePtr searcher_;
256 
257  void
258  applyFilter (PCLPointCloud2 &output) override;
259 
260  void
261  applyFilter (std::vector<int> &indices) override;
262  };
263 }
264 
265 #ifdef PCL_NO_PRECOMPILE
266 #include <pcl/filters/impl/radius_outlier_removal.hpp>
267 #endif
KdTreePtr searcher_
A pointer to the spatial search object.
shared_ptr< ::pcl::PCLPointCloud2 > Ptr
shared_ptr< PointCloud< PointT > > Ptr
Definition: point_cloud.h:414
double getRadiusSearch()
Get the sphere radius used for determining the k-nearest neighbors.
shared_ptr< const ::pcl::PCLPointCloud2 > ConstPtr
int min_pts_radius_
The minimum number of neighbors that a point needs to have in the given search radius to be considere...
RadiusOutlierRemoval(bool extract_removed_indices=false)
Empty constructor.
void applyFilter(std::vector< int > &indices) override
Filtered results are indexed by an indices array.
RadiusOutlierRemoval filters points in a cloud based on the number of neighbors they have...
FilterIndices represents the base class for filters that are about binary point removal.
RadiusOutlierRemoval(bool extract_removed_indices=false)
Constructor.
double getRadiusSearch()
Get the radius of the sphere that will determine which points are neighbors.
void setRadiusSearch(double radius)
Set the radius of the sphere that will determine which points are neighbors.
Filter represents the base filter class.
Definition: filter.h:83
PCL base class.
Definition: pcl_base.h:70
typename PointCloud::Ptr PointCloudPtr
Definition: pcl_base.h:74
PointCloud represents the base class in PCL for storing collections of 3D points. ...
typename pcl::search::Search< PointT >::Ptr SearcherPtr
PCLPointCloud2::ConstPtr PCLPointCloud2ConstPtr
Definition: pcl_base.h:187
shared_ptr< const PointCloud< PointT > > ConstPtr
Definition: point_cloud.h:415
shared_ptr< RadiusOutlierRemoval< PointT > > Ptr
void setMinNeighborsInRadius(int min_pts)
Set the minimum number of neighbors that a point needs to have in the given search radius in order to...
shared_ptr< pcl::search::Search< PointT > > Ptr
Definition: search.h:80
void setMinNeighborsInRadius(int min_pts)
Set the number of neighbors that need to be present in order to be classified as an inlier...
double getMinNeighborsInRadius()
Get the minimum number of neighbors that a point needs to have in the given search radius to be consi...
std::string filter_name_
The filter name.
Definition: filter.h:161
int getMinNeighborsInRadius()
Get the number of neighbors that need to be present in order to be classified as an inlier...
shared_ptr< const Filter< PointT > > ConstPtr
Definition: filter.h:87
A point structure representing Euclidean xyz coordinates, and the RGB color.
void setRadiusSearch(double radius)
Set the sphere radius that is to be used for determining the k-nearest neighbors for filtering...
boost::shared_ptr< T > shared_ptr
Alias for boost::shared_ptr.
Definition: memory.h:81
#define PCL_EXPORTS
Definition: pcl_macros.h:276
double search_radius_
The nearest neighbors search radius for each point.
void applyFilterIndices(std::vector< int > &indices)
Filtered results are indexed by an indices array.
PCLPointCloud2::Ptr PCLPointCloud2Ptr
Definition: pcl_base.h:186
typename PointCloud::ConstPtr PointCloudConstPtr
Definition: pcl_base.h:75