Point Cloud Library (PCL)  1.14.1-dev
vtk_mesh_smoothing_windowed_sinc.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2011, Willow Garage, Inc.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of Willow Garage, Inc. nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * $Id$
36  *
37  */
38 
39 #pragma once
40 
41 #include <pcl/surface/processing.h>
42 #include <pcl/surface/vtk_smoothing/vtk.h>
43 
44 namespace pcl
45 {
46  /** \brief PCL mesh smoothing based on the vtkWindowedSincPolyDataFilter algorithm from the VTK library.
47  * Please check out the original documentation for more details on the inner workings of the algorithm
48  * Warning: This wrapper does two fairly computationally expensive conversions from the PCL PolygonMesh
49  * data structure to the vtkPolyData data structure and back.
50  */
52  {
53  public:
54  /** \brief Empty constructor that sets the values of the algorithm parameters to the VTK defaults */
56 
57  /** \brief Set the number of iterations for the smoothing filter.
58  * \param[in] num_iter the number of iterations
59  */
60  inline void
61  setNumIter (int num_iter)
62  {
63  num_iter_ = num_iter;
64  };
65 
66  /** \brief Get the number of iterations. */
67  inline int
68  getNumIter () const
69  {
70  return num_iter_;
71  };
72 
73  /** \brief Set the pass band value for windowed sinc filtering.
74  * \param[in] pass_band value for the pass band.
75  */
76  inline void
77  setPassBand (float pass_band)
78  {
79  pass_band_ = pass_band;
80  };
81 
82  /** \brief Get the pass band value. */
83  inline float
84  getPassBand () const
85  {
86  return pass_band_;
87  };
88 
89  /** \brief Turn on/off coordinate normalization. The positions can be translated and scaled such that they fit
90  * within a [-1, 1] prior to the smoothing computation. The default is off. The numerical stability of the
91  * solution can be improved by turning normalization on. If normalization is on, the coordinates will be rescaled
92  * to the original coordinate system after smoothing has completed.
93  * \param[in] normalize_coordinates decision whether to normalize coordinates or not
94  */
95  inline void
96  setNormalizeCoordinates (bool normalize_coordinates)
97  {
98  normalize_coordinates_ = normalize_coordinates;
99  }
100 
101  /** \brief Get whether the coordinate normalization is active or not */
102  inline bool
104  {
105  return normalize_coordinates_;
106  }
107 
108  /** \brief Turn on/off smoothing along sharp interior edges.
109  * \param[in] feature_edge_smoothing whether to enable/disable smoothing along sharp interior edges
110  */
111  inline void
112  setFeatureEdgeSmoothing (bool feature_edge_smoothing)
113  {
114  feature_edge_smoothing_ = feature_edge_smoothing;
115  };
116 
117  /** \brief Get the status of the feature edge smoothing */
118  inline bool
120  {
121  return feature_edge_smoothing_;
122  };
123 
124  /** \brief Specify the feature angle for sharp edge identification.
125  * \param[in] feature_angle the angle threshold for considering an edge to be sharp
126  */
127  inline void
128  setFeatureAngle (float feature_angle)
129  {
130  feature_angle_ = feature_angle;
131  };
132 
133  /** \brief Get the angle threshold for considering an edge to be sharp */
134  inline float
136  {
137  return feature_angle_;
138  };
139 
140  /** \brief Specify the edge angle to control smoothing along edges (either interior or boundary).
141  * \param[in] edge_angle the angle to control smoothing along edges
142  */
143  inline void
144  setEdgeAngle (float edge_angle)
145  {
146  edge_angle_ = edge_angle;
147  };
148 
149  /** \brief Get the edge angle to control smoothing along edges */
150  inline float
151  getEdgeAngle () const
152  {
153  return edge_angle_;
154  };
155 
156 
157  /** \brief Turn on/off the smoothing of vertices on the boundary of the mesh.
158  * \param[in] boundary_smoothing decision whether boundary smoothing is on or off
159  */
160  inline void
161  setBoundarySmoothing (bool boundary_smoothing)
162  {
163  boundary_smoothing_ = boundary_smoothing;
164  };
165 
166  /** \brief Get the status of the boundary smoothing */
167  inline bool
169  {
170  return boundary_smoothing_;
171  }
172 
173 
174  protected:
175  void
177 
178  private:
179  vtkSmartPointer<vtkPolyData> vtk_polygons_;
180  int num_iter_{20};
181  float pass_band_{0.1f};
182  bool feature_edge_smoothing_{false};
183  float feature_angle_{45.f};
184  float edge_angle_{15.f};
185  bool boundary_smoothing_{true};
186  bool normalize_coordinates_{false};
187  };
188 }
MeshProcessing represents the base class for mesh processing algorithms.
Definition: processing.h:95
PCL mesh smoothing based on the vtkWindowedSincPolyDataFilter algorithm from the VTK library.
float getFeatureAngle() const
Get the angle threshold for considering an edge to be sharp.
bool getFeatureEdgeSmoothing() const
Get the status of the feature edge smoothing.
float getEdgeAngle() const
Get the edge angle to control smoothing along edges.
void setFeatureEdgeSmoothing(bool feature_edge_smoothing)
Turn on/off smoothing along sharp interior edges.
void setFeatureAngle(float feature_angle)
Specify the feature angle for sharp edge identification.
void setNumIter(int num_iter)
Set the number of iterations for the smoothing filter.
void setEdgeAngle(float edge_angle)
Specify the edge angle to control smoothing along edges (either interior or boundary).
bool getNormalizeCoordinates() const
Get whether the coordinate normalization is active or not.
bool getBoundarySmoothing() const
Get the status of the boundary smoothing.
void setPassBand(float pass_band)
Set the pass band value for windowed sinc filtering.
void setNormalizeCoordinates(bool normalize_coordinates)
Turn on/off coordinate normalization.
void performProcessing(pcl::PolygonMesh &output) override
Abstract surface processing method.
float getPassBand() const
Get the pass band value.
MeshSmoothingWindowedSincVTK()=default
Empty constructor that sets the values of the algorithm parameters to the VTK defaults.
int getNumIter() const
Get the number of iterations.
void setBoundarySmoothing(bool boundary_smoothing)
Turn on/off the smoothing of vertices on the boundary of the mesh.
#define PCL_EXPORTS
Definition: pcl_macros.h:325