Go to the documentation of this file.00001 #ifndef SURFACE_H_
00002 #define SURFACE_H_
00003
00004 #include <pcl/kdtree/kdtree_flann.h>
00005 #include <pcl/surface/mls.h>
00006 #include <pcl/surface/convex_hull.h>
00007 #include <pcl/surface/concave_hull.h>
00008 #include <pcl/surface/gp3.h>
00009 #include <pcl/surface/marching_cubes_greedy.h>
00010
00011 #include "typedefs.h"
00012
00013
00014 class Mesh
00015 {
00016 public:
00017 Mesh () : points (new PointCloud) {}
00018 PointCloudPtr points;
00019 std::vector<pcl::Vertices> faces;
00020 };
00021
00022 typedef boost::shared_ptr<Mesh> MeshPtr;
00023
00024 PointCloudPtr
00025 smoothPointCloud (const PointCloudPtr & input, float radius, int polynomial_order)
00026 {
00027 pcl::MovingLeastSquares<PointT, NormalT> mls;
00028 mls.setSearchMethod (pcl::KdTreeFLANN<PointT>::Ptr (new pcl::KdTreeFLANN<PointT>));
00029 mls.setSearchRadius (radius);
00030 mls.setSqrGaussParam (radius*radius);
00031 mls.setPolynomialFit (polynomial_order > 1);
00032 mls.setPolynomialOrder (polynomial_order);
00033
00034 mls.setInputCloud (input);
00035
00036 PointCloudPtr output (new PointCloud);
00037 mls.reconstruct (*output);
00038
00039 return (output);
00040 }
00041
00042 SurfaceElementsPtr
00043 computeSurfaceElements (const PointCloudPtr & input, float radius, int polynomial_order)
00044 {
00045 pcl::MovingLeastSquares<PointT, NormalT> mls;
00046 mls.setSearchMethod (pcl::KdTreeFLANN<PointT>::Ptr (new pcl::KdTreeFLANN<PointT>));
00047 mls.setSearchRadius (radius);
00048 mls.setSqrGaussParam (radius*radius);
00049 mls.setPolynomialFit (polynomial_order > 1);
00050 mls.setPolynomialOrder (polynomial_order);
00051
00052 mls.setInputCloud (input);
00053
00054 PointCloudPtr points (new PointCloud);
00055 SurfaceNormalsPtr normals (new SurfaceNormals);
00056 mls.setOutputNormals (normals);
00057 mls.reconstruct (*points);
00058
00059 SurfaceElementsPtr surfels (new SurfaceElements);
00060 pcl::copyPointCloud (*points, *surfels);
00061 pcl::copyPointCloud (*normals, *surfels);
00062 return (surfels);
00063 }
00064
00065 MeshPtr
00066 computeConvexHull (const PointCloudPtr & input)
00067 {
00068 pcl::ConvexHull<PointT> convex_hull;
00069 convex_hull.setInputCloud (input);
00070
00071 MeshPtr output (new Mesh);
00072 convex_hull.reconstruct (*(output->points), output->faces);
00073
00074 return (output);
00075 }
00076
00077
00078 MeshPtr
00079 computeConcaveHull (const PointCloudPtr & input, float alpha)
00080 {
00081 pcl::ConcaveHull<PointT> concave_hull;
00082 concave_hull.setInputCloud (input);
00083 concave_hull.setAlpha (alpha);
00084
00085 MeshPtr output (new Mesh);
00086 concave_hull.reconstruct (*(output->points), output->faces);
00087
00088 return (output);
00089 }
00090
00091 pcl::PolygonMesh::Ptr
00092 greedyTriangulation (const SurfaceElementsPtr & surfels, float radius, float mu, int max_nearest_neighbors,
00093 float max_surface_angle, float min_angle, float max_angle)
00094
00095 {
00096 pcl::GreedyProjectionTriangulation<pcl::PointNormal> gpt;
00097 gpt.setSearchMethod (pcl::KdTreeFLANN<pcl::PointNormal>::Ptr (new pcl::KdTreeFLANN<pcl::PointNormal>));
00098
00099 gpt.setSearchRadius (radius);
00100 gpt.setMaximumNearestNeighbors (max_nearest_neighbors);
00101 gpt.setMu (mu);
00102 gpt.setMaximumSurfaceAgle (max_surface_angle);
00103 gpt.setMinimumAngle (min_angle);
00104 gpt.setMaximumAngle (max_angle);
00105 gpt.setNormalConsistency (true);
00106
00107 gpt.setInputCloud (surfels);
00108 pcl::PolygonMesh::Ptr output (new pcl::PolygonMesh);
00109 gpt.reconstruct (*output);
00110
00111 return (output);
00112 }
00113
00114
00115 pcl::PolygonMesh::Ptr
00116 marchingCubesTriangulation (const SurfaceElementsPtr & surfels, float leaf_size, float iso_level)
00117 {
00118 pcl::MarchingCubesGreedy<SurfelT> marching_cubes;
00119 marching_cubes.setSearchMethod (pcl::KdTree<SurfelT>::Ptr (new pcl::KdTreeFLANN<SurfelT> ()));
00120 marching_cubes.setLeafSize (leaf_size);
00121 marching_cubes.setIsoLevel (iso_level);
00122
00123 marching_cubes.setInputCloud (surfels);
00124 pcl::PolygonMesh::Ptr output (new pcl::PolygonMesh);
00125 marching_cubes.reconstruct (*output);
00126
00127 return (output);
00128 }
00129
00130 #endif