Point Cloud Library (PCL) 1.14.0
Loading...
Searching...
No Matches
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
44namespace 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 */
51 class PCL_EXPORTS MeshSmoothingLaplacianVTK : public MeshProcessing
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
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
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.