Point Cloud Library (PCL) 1.12.1
filter.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 *
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/pcl_base.h>
43#include <pcl/common/io.h> // for copyPointCloud
44#include <pcl/PointIndices.h>
45
46namespace pcl
47{
48 /** \brief Removes points with x, y, or z equal to NaN
49 * \param[in] cloud_in the input point cloud
50 * \param[out] cloud_out the output point cloud
51 * \param[out] index the mapping (ordered): cloud_out[i] = cloud_in[index[i]]
52 * \note The density of the point cloud is lost.
53 * \note Can be called with cloud_in == cloud_out
54 * \ingroup filters
55 */
56 template<typename PointT> void
58 pcl::PointCloud<PointT> &cloud_out,
59 Indices &index);
60
61 /** \brief Removes points that have their normals invalid (i.e., equal to NaN)
62 * \param[in] cloud_in the input point cloud
63 * \param[out] cloud_out the output point cloud
64 * \param[out] index the mapping (ordered): cloud_out[i] = cloud_in[index[i]]
65 * \note The density of the point cloud is lost.
66 * \note Can be called with cloud_in == cloud_out
67 * \ingroup filters
68 */
69 template<typename PointT> void
71 pcl::PointCloud<PointT> &cloud_out,
72 Indices &index);
73
74 ////////////////////////////////////////////////////////////////////////////////////////////
75 /** \brief Filter represents the base filter class. All filters must inherit from this interface.
76 * \author Radu B. Rusu
77 * \ingroup filters
78 */
79 template<typename PointT>
80 class Filter : public PCLBase<PointT>
81 {
82 public:
83 using Ptr = shared_ptr<Filter<PointT> >;
84 using ConstPtr = shared_ptr<const Filter<PointT> >;
85
86
90
91 /** \brief Empty constructor.
92 * \param[in] extract_removed_indices set to true if the filtered data indices should be saved in a
93 * separate list. Default: false.
94 */
95 Filter (bool extract_removed_indices = false) :
97 extract_removed_indices_ (extract_removed_indices)
98 {
99 }
100
101 /** \brief Get the point indices being removed */
102 inline IndicesConstPtr const
104 {
105 return (removed_indices_);
106 }
107
108 /** \brief Get the point indices being removed
109 * \param[out] pi the resultant point indices that have been removed
110 */
111 inline void
113 {
115 }
116
117 /** \brief Calls the filtering method and returns the filtered dataset in output.
118 * \param[out] output the resultant filtered point cloud dataset
119 */
120 inline void
122 {
123 if (!initCompute ())
124 return;
125
126 if (input_.get () == &output) // cloud_in = cloud_out
127 {
128 PointCloud output_temp;
129 applyFilter (output_temp);
130 output_temp.header = input_->header;
131 output_temp.sensor_origin_ = input_->sensor_origin_;
132 output_temp.sensor_orientation_ = input_->sensor_orientation_;
133 pcl::copyPointCloud (output_temp, output);
134 }
135 else
136 {
137 output.header = input_->header;
138 output.sensor_origin_ = input_->sensor_origin_;
139 output.sensor_orientation_ = input_->sensor_orientation_;
140 applyFilter (output);
141 }
142
143 deinitCompute ();
144 }
145
146 protected:
147
150
153
154 /** \brief Indices of the points that are removed */
156
157 /** \brief The filter name. */
158 std::string filter_name_;
159
160 /** \brief Set to true if we want to return the indices of the removed points. */
162
163 /** \brief Abstract filter method.
164 *
165 * The implementation needs to set output.{points, width, height, is_dense}.
166 *
167 * \param[out] output the resultant filtered point cloud
168 */
169 virtual void
170 applyFilter (PointCloud &output) = 0;
171
172 /** \brief Get a string representation of the name of this class. */
173 inline const std::string&
175 {
176 return (filter_name_);
177 }
178 };
179
180 ////////////////////////////////////////////////////////////////////////////////////////////
181 /** \brief Filter represents the base filter class. All filters must inherit from this interface.
182 * \author Radu B. Rusu
183 * \ingroup filters
184 */
185 template<>
186 class PCL_EXPORTS Filter<pcl::PCLPointCloud2> : public PCLBase<pcl::PCLPointCloud2>
187 {
188 public:
189 using Ptr = shared_ptr<Filter<pcl::PCLPointCloud2> >;
190 using ConstPtr = shared_ptr<const Filter<pcl::PCLPointCloud2> >;
191
195
196 /** \brief Empty constructor.
197 * \param[in] extract_removed_indices set to true if the filtered data indices should be saved in a
198 * separate list. Default: false.
199 */
200 Filter (bool extract_removed_indices = false) :
201 removed_indices_ (new Indices),
202 extract_removed_indices_ (extract_removed_indices)
203 {
204 }
205
206 /** \brief Get the point indices being removed */
207 inline IndicesConstPtr const
209 {
210 return (removed_indices_);
211 }
212
213 /** \brief Get the point indices being removed
214 * \param[out] pi the resultant point indices that have been removed
215 */
216 inline void
218 {
219 pi.indices = *removed_indices_;
220 }
221
222 /** \brief Calls the filtering method and returns the filtered dataset in output.
223 * \param[out] output the resultant filtered point cloud dataset
224 */
225 void
227
228 protected:
229
230 /** \brief Indices of the points that are removed */
232
233 /** \brief Set to true if we want to return the indices of the removed points. */
235
236 /** \brief The filter name. */
237 std::string filter_name_;
238
239 /** \brief Abstract filter method.
240 *
241 * The implementation needs to set output.{data, row_step, point_step, width, height, is_dense}.
242 *
243 * \param[out] output the resultant filtered point cloud
244 */
245 virtual void
247
248 /** \brief Get a string representation of the name of this class. */
249 inline const std::string&
251 {
252 return (filter_name_);
253 }
254 };
255}
256
257#ifdef PCL_NO_PRECOMPILE
258#include <pcl/filters/impl/filter.hpp>
259#endif
virtual void applyFilter(PCLPointCloud2 &output)=0
Abstract filter method.
const std::string & getClassName() const
Get a string representation of the name of this class.
Definition: filter.h:250
Filter(bool extract_removed_indices=false)
Empty constructor.
Definition: filter.h:200
shared_ptr< const Filter< pcl::PCLPointCloud2 > > ConstPtr
Definition: filter.h:190
std::string filter_name_
The filter name.
Definition: filter.h:237
void filter(PCLPointCloud2 &output)
Calls the filtering method and returns the filtered dataset in output.
IndicesPtr removed_indices_
Indices of the points that are removed.
Definition: filter.h:231
shared_ptr< Filter< pcl::PCLPointCloud2 > > Ptr
Definition: filter.h:189
bool extract_removed_indices_
Set to true if we want to return the indices of the removed points.
Definition: filter.h:234
void getRemovedIndices(PointIndices &pi)
Get the point indices being removed.
Definition: filter.h:217
IndicesConstPtr const getRemovedIndices() const
Get the point indices being removed.
Definition: filter.h:208
Filter represents the base filter class.
Definition: filter.h:81
void filter(PointCloud &output)
Calls the filtering method and returns the filtered dataset in output.
Definition: filter.h:121
virtual void applyFilter(PointCloud &output)=0
Abstract filter method.
bool extract_removed_indices_
Set to true if we want to return the indices of the removed points.
Definition: filter.h:161
IndicesConstPtr const getRemovedIndices() const
Get the point indices being removed.
Definition: filter.h:103
shared_ptr< Filter< PointT > > Ptr
Definition: filter.h:83
shared_ptr< const Filter< PointT > > ConstPtr
Definition: filter.h:84
const std::string & getClassName() const
Get a string representation of the name of this class.
Definition: filter.h:174
std::string filter_name_
The filter name.
Definition: filter.h:158
void getRemovedIndices(PointIndices &pi)
Get the point indices being removed.
Definition: filter.h:112
IndicesPtr removed_indices_
Indices of the points that are removed.
Definition: filter.h:155
Filter(bool extract_removed_indices=false)
Empty constructor.
Definition: filter.h:95
PCLPointCloud2::Ptr PCLPointCloud2Ptr
Definition: pcl_base.h:185
PCLPointCloud2::ConstPtr PCLPointCloud2ConstPtr
Definition: pcl_base.h:186
PCL base class.
Definition: pcl_base.h:70
PointCloudConstPtr input_
The input point cloud dataset.
Definition: pcl_base.h:147
typename PointCloud::Ptr PointCloudPtr
Definition: pcl_base.h:73
typename PointCloud::ConstPtr PointCloudConstPtr
Definition: pcl_base.h:74
bool initCompute()
This method should get called before starting the actual computation.
Definition: pcl_base.hpp:138
bool deinitCompute()
This method should get called after finishing the actual computation.
Definition: pcl_base.hpp:174
PointCloud represents the base class in PCL for storing collections of 3D points.
Definition: point_cloud.h:173
Eigen::Quaternionf sensor_orientation_
Sensor acquisition pose (rotation).
Definition: point_cloud.h:408
pcl::PCLHeader header
The point cloud header.
Definition: point_cloud.h:392
Eigen::Vector4f sensor_origin_
Sensor acquisition pose (origin/translation).
Definition: point_cloud.h:406
shared_ptr< PointCloud< PointT > > Ptr
Definition: point_cloud.h:413
shared_ptr< const PointCloud< PointT > > ConstPtr
Definition: point_cloud.h:414
void copyPointCloud(const pcl::PointCloud< PointInT > &cloud_in, pcl::PointCloud< PointOutT > &cloud_out)
Copy all the fields from a given point cloud into a new point cloud.
Definition: io.hpp:144
void removeNaNNormalsFromPointCloud(const pcl::PointCloud< PointT > &cloud_in, pcl::PointCloud< PointT > &cloud_out, Indices &index)
Removes points that have their normals invalid (i.e., equal to NaN)
Definition: filter.hpp:99
void removeNaNFromPointCloud(const pcl::PointCloud< PointT > &cloud_in, pcl::PointCloud< PointT > &cloud_out, Indices &index)
Removes points with x, y, or z equal to NaN.
Definition: filter.hpp:46
shared_ptr< const Indices > IndicesConstPtr
Definition: pcl_base.h:59
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition: types.h:133
shared_ptr< Indices > IndicesPtr
Definition: pcl_base.h:58
#define PCL_EXPORTS
Definition: pcl_macros.h:323
shared_ptr< ::pcl::PCLPointCloud2 > Ptr
shared_ptr< const ::pcl::PCLPointCloud2 > ConstPtr