Point Cloud Library (PCL) 1.13.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 : 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
76 getNumIter () const
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
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}
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.
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.
MeshSmoothingLaplacianVTK()
Empty constructor that sets the values of the algorithm parameters to the VTK defaults.
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.