Point Cloud Library (PCL)  1.14.1-dev
vtk_mesh_smoothing_laplacian.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 vtkSmoothPolyDataFilter 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 Specify a convergence criterion for the iteration process. Smaller numbers result in more smoothing iterations.
74  * \param[in] convergence convergence criterion for the Laplacian smoothing
75  */
76  inline void
77  setConvergence (float convergence)
78  {
79  convergence_ = convergence;
80  };
81 
82  /** \brief Get the convergence criterion. */
83  inline float
84  getConvergence () const
85  {
86  return convergence_;
87  };
88 
89  /** \brief Specify the relaxation factor for Laplacian smoothing. As in all iterative methods,
90  * the stability of the process is sensitive to this parameter.
91  * In general, small relaxation factors and large numbers of iterations are more stable than larger relaxation
92  * factors and smaller numbers of iterations.
93  * \param[in] relaxation_factor the relaxation factor of the Laplacian smoothing algorithm
94  */
95  inline void
96  setRelaxationFactor (float relaxation_factor)
97  {
98  relaxation_factor_ = relaxation_factor;
99  };
100 
101  /** \brief Get the relaxation factor of the Laplacian smoothing */
102  inline float
104  {
105  return relaxation_factor_;
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  /** \brief Turn on/off the smoothing of vertices on the boundary of the mesh.
157  * \param[in] boundary_smoothing decision whether boundary smoothing is on or off
158  */
159  inline void
160  setBoundarySmoothing (bool boundary_smoothing)
161  {
162  boundary_smoothing_ = boundary_smoothing;
163  };
164 
165  /** \brief Get the status of the boundary smoothing */
166  inline bool
168  {
169  return boundary_smoothing_;
170  }
171 
172  protected:
173  void
175 
176  private:
177  vtkSmartPointer<vtkPolyData> vtk_polygons_;
178 
179  /// Parameters
180  int num_iter_{20};
181  float convergence_{0.0f};
182  float relaxation_factor_{0.01f};
183  bool feature_edge_smoothing_{false};
184  float feature_angle_{45.f};
185  float edge_angle_{15.f};
186  bool boundary_smoothing_{true};
187  };
188 }
MeshProcessing represents the base class for mesh processing algorithms.
Definition: processing.h:95
PCL mesh smoothing based on the vtkSmoothPolyDataFilter algorithm from the VTK library.
void setConvergence(float convergence)
Specify a convergence criterion for the iteration process.
void setEdgeAngle(float edge_angle)
Specify the edge angle to control smoothing along edges (either interior or boundary).
float getConvergence() const
Get the convergence criterion.
bool getFeatureEdgeSmoothing() const
Get the status of the feature edge smoothing.
void setNumIter(int num_iter)
Set the number of iterations for the smoothing filter.
bool getBoundarySmoothing() const
Get the status of the boundary smoothing.
MeshSmoothingLaplacianVTK()=default
Empty constructor that sets the values of the algorithm parameters to the VTK defaults.
int getNumIter() const
Get the number of iterations.
void performProcessing(pcl::PolygonMesh &output) override
Abstract surface processing method.
float getFeatureAngle() const
Get the angle threshold for considering an edge to be sharp.
void setRelaxationFactor(float relaxation_factor)
Specify the relaxation factor for Laplacian smoothing.
float getEdgeAngle() const
Get the edge angle to control smoothing along edges.
void setFeatureAngle(float feature_angle)
Specify the feature angle for sharp edge identification.
float getRelaxationFactor() const
Get the relaxation factor of the Laplacian smoothing.
void setBoundarySmoothing(bool boundary_smoothing)
Turn on/off the smoothing of vertices on the boundary of the mesh.
void setFeatureEdgeSmoothing(bool feature_edge_smoothing)
Turn on/off smoothing along sharp interior edges.
#define PCL_EXPORTS
Definition: pcl_macros.h:325