Point Cloud Library (PCL)  1.9.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  : num_iter_ (20)
57  , convergence_ (0.0f)
58  , relaxation_factor_ (0.01f)
59  , feature_edge_smoothing_ (false)
60  , feature_angle_ (45.f)
61  , edge_angle_ (15.f)
62  , boundary_smoothing_ (true)
63  {};
64 
65  /** \brief Set the number of iterations for the smoothing filter.
66  * \param[in] num_iter the number of iterations
67  */
68  inline void
69  setNumIter (int num_iter)
70  {
71  num_iter_ = num_iter;
72  };
73 
74  /** \brief Get the number of iterations. */
75  inline int
77  {
78  return num_iter_;
79  };
80 
81  /** \brief Specify a convergence criterion for the iteration process. Smaller numbers result in more smoothing iterations.
82  * \param[in] convergence convergence criterion for the Laplacian smoothing
83  */
84  inline void
85  setConvergence (float convergence)
86  {
87  convergence_ = convergence;
88  };
89 
90  /** \brief Get the convergence criterion. */
91  inline float
93  {
94  return convergence_;
95  };
96 
97  /** \brief Specify the relaxation factor for Laplacian smoothing. As in all iterative methods,
98  * the stability of the process is sensitive to this parameter.
99  * In general, small relaxation factors and large numbers of iterations are more stable than larger relaxation
100  * factors and smaller numbers of iterations.
101  * \param[in] relaxation_factor the relaxation factor of the Laplacian smoothing algorithm
102  */
103  inline void
104  setRelaxationFactor (float relaxation_factor)
105  {
106  relaxation_factor_ = relaxation_factor;
107  };
108 
109  /** \brief Get the relaxation factor of the Laplacian smoothing */
110  inline float
112  {
113  return relaxation_factor_;
114  };
115 
116  /** \brief Turn on/off smoothing along sharp interior edges.
117  * \param[in] feature_edge_smoothing whether to enable/disable smoothing along sharp interior edges
118  */
119  inline void
120  setFeatureEdgeSmoothing (bool feature_edge_smoothing)
121  {
122  feature_edge_smoothing_ = feature_edge_smoothing;
123  };
124 
125  /** \brief Get the status of the feature edge smoothing */
126  inline bool
128  {
129  return feature_edge_smoothing_;
130  };
131 
132  /** \brief Specify the feature angle for sharp edge identification.
133  * \param[in] feature_angle the angle threshold for considering an edge to be sharp
134  */
135  inline void
136  setFeatureAngle (float feature_angle)
137  {
138  feature_angle_ = feature_angle;
139  };
140 
141  /** \brief Get the angle threshold for considering an edge to be sharp */
142  inline float
144  {
145  return feature_angle_;
146  };
147 
148  /** \brief Specify the edge angle to control smoothing along edges (either interior or boundary).
149  * \param[in] edge_angle the angle to control smoothing along edges
150  */
151  inline void
152  setEdgeAngle (float edge_angle)
153  {
154  edge_angle_ = edge_angle;
155  };
156 
157  /** \brief Get the edge angle to control smoothing along edges */
158  inline float
160  {
161  return edge_angle_;
162  };
163 
164  /** \brief Turn on/off the smoothing of vertices on the boundary of the mesh.
165  * \param[in] boundary_smoothing decision whether boundary smoothing is on or off
166  */
167  inline void
168  setBoundarySmoothing (bool boundary_smoothing)
169  {
170  boundary_smoothing_ = boundary_smoothing;
171  };
172 
173  /** \brief Get the status of the boundary smoothing */
174  inline bool
176  {
177  return boundary_smoothing_;
178  }
179 
180  protected:
181  void
182  performProcessing (pcl::PolygonMesh &output) override;
183 
184  private:
185  vtkSmartPointer<vtkPolyData> vtk_polygons_;
186 
187  /// Parameters
188  int num_iter_;
189  float convergence_;
190  float relaxation_factor_;
191  bool feature_edge_smoothing_;
192  float feature_angle_;
193  float edge_angle_;
194  bool boundary_smoothing_;
195  };
196 }
float getRelaxationFactor()
Get the relaxation factor of the Laplacian smoothing.
void setFeatureEdgeSmoothing(bool feature_edge_smoothing)
Turn on/off smoothing along sharp interior edges.
bool getBoundarySmoothing()
Get the status of the boundary smoothing.
MeshSmoothingLaplacianVTK()
Empty constructor that sets the values of the algorithm parameters to the VTK defaults.
void setNumIter(int num_iter)
Set the number of iterations for the smoothing filter.
MeshProcessing represents the base class for mesh processing algorithms.
Definition: processing.h:93
This file defines compatibility wrappers for low level I/O functions.
Definition: convolution.h:45
float getConvergence()
Get the convergence criterion.
float getFeatureAngle()
Get the angle threshold for considering an edge to be sharp.
void setRelaxationFactor(float relaxation_factor)
Specify the relaxation factor for Laplacian smoothing.
PCL mesh smoothing based on the vtkSmoothPolyDataFilter algorithm from the VTK library.
void setEdgeAngle(float edge_angle)
Specify the edge angle to control smoothing along edges (either interior or boundary).
void setConvergence(float convergence)
Specify a convergence criterion for the iteration process.
float getEdgeAngle()
Get the edge angle to control smoothing along edges.
void setBoundarySmoothing(bool boundary_smoothing)
Turn on/off the smoothing of vertices on the boundary of the mesh.
int getNumIter()
Get the number of iterations.
bool getFeatureEdgeSmoothing()
Get the status of the feature edge smoothing.
#define PCL_EXPORTS
Definition: pcl_macros.h:241
void setFeatureAngle(float feature_angle)
Specify the feature angle for sharp edge identification.