1 #include "surface.h"
2 
3 #include <string>
4 #include <pcl/console/parse.h>
5 #include <pcl/io/pcd_io.h>
6 #include <pcl/visualization/pcl_visualizer.h>
7 #include <boost/algorithm/string/split.hpp> // for split
8 
9 int
main(int argc,char ** argv)10 main (int argc, char ** argv)
11 {
12   if (argc < 2)
13   {
14     pcl::console::print_info ("Syntax is: %s input.pcd <options>\n", argv[0]);
15     pcl::console::print_info ("  where options are:\n");
16     pcl::console::print_info ("    --surfel radius,order............... Compute surface elements\n");
17     pcl::console::print_info ("    --convex ........................... Compute convex hull\n");
18     pcl::console::print_info ("    --concave alpha .................... Compute concave hull\n");
19     pcl::console::print_info ("    --greedy radius,max_nn,mu,surf_angle,min_angle,max_angle ... Compute greedy triangulation\n");
20     pcl::console::print_info ("    -s output.pcd ...................... Save the output cloud\n");
21 
22     return (1);
23   }
24 
25   // Load the points
26   PointCloudPtr cloud (new PointCloud);
27   pcl::io::loadPCDFile (argv[1], *cloud);
28   pcl::console::print_info ("Loaded %s (%lu points)\n", argv[1], cloud->size ());
29 
30   // Compute surface elements
31   SurfaceElementsPtr surfels (new SurfaceElements);
32   double mls_radius, polynomial_order;
33   bool compute_surface_elements =
34     pcl::console::parse_2x_arguments (argc, argv, "--surfel", mls_radius, polynomial_order) > 0;
35   if (compute_surface_elements)
36   {
37     surfels = computeSurfaceElements (cloud, mls_radius, polynomial_order);
38     pcl::console::print_info ("Computed surface elements\n");
39   }
40 
41   // Find the convex hull
42   MeshPtr convex_hull;
43   bool compute_convex_hull = pcl::console::find_argument (argc, argv, "--convex") > 0;
44   if (compute_convex_hull)
45   {
46     convex_hull = computeConvexHull (cloud);
47     pcl::console::print_info ("Computed convex hull\n");
48   }
49 
50   // Find the concave hull
51   MeshPtr concave_hull;
52   double alpha;
53   bool compute_concave_hull = pcl::console::parse_argument (argc, argv, "--concave", alpha) > 0;
54   if (compute_concave_hull)
55   {
56     concave_hull = computeConcaveHull (cloud, alpha);
57     pcl::console::print_info ("Computed concave hull\n");
58   }
59 
60   // Compute a greedy surface triangulation
61   pcl::PolygonMesh::Ptr greedy_mesh;
62   std::string params_string;
63   bool perform_greedy_triangulation = pcl::console::parse_argument (argc, argv, "--greedy", params_string) > 0;
64   if (perform_greedy_triangulation)
65   {
66     assert (surfels);
67 
68     std::vector<std::string> tokens;
69     boost::split (tokens, params_string, boost::is_any_of (","), boost::token_compress_on);
70     assert (tokens.size () == 6);
71     float radius = atof(tokens[0].c_str ());
72     int max_nearest_neighbors = atoi(tokens[1].c_str ());
73     float mu = atof(tokens[2].c_str ());
74     float max_surface_angle = atof(tokens[3].c_str ());
75     float min_angle = atof(tokens[4].c_str ());
76     float max_angle = atof(tokens[5].c_str ());
77 
78     greedy_mesh = greedyTriangulation (surfels, radius, max_nearest_neighbors, mu,
79                                        max_surface_angle, min_angle, max_angle);
80 
81     pcl::console::print_info ("Performed greedy surface triangulation\n");
82   }
83 
84 
85   // Compute a greedy surface triangulation
86   pcl::PolygonMesh::Ptr marching_cubes_mesh;
87   double leaf_size, iso_level;
88   bool perform_marching_cubes = pcl::console::parse_2x_arguments (argc, argv, "--mc", leaf_size, iso_level) > 0;
89   if (perform_marching_cubes)
90   {
91     assert (surfels);
92 
93     marching_cubes_mesh = marchingCubesTriangulation (surfels, leaf_size, iso_level);
94 
95     pcl::console::print_info ("Performed marching cubes surface triangulation\n");
96   }
97 
98   // Save output
99   std::string output_filename;
100   bool save_output = pcl::console::parse_argument (argc, argv, "-s", output_filename) > 0;
101   if (save_output)
102   {
103     // Save the result
104     pcl::io::savePCDFile (output_filename, *cloud);
105 
106     pcl::console::print_info ("Saved result as %s\n", output_filename.c_str ());
107   }
108   // Or visualize the result
109   else
110   {
111     pcl::console::print_info ("Starting visualizer... Close window to exit.\n");
112     pcl::visualization::PCLVisualizer vis;
113     vis.addPointCloud (cloud);
114     vis.resetCamera ();
115 
116     if (compute_convex_hull)
117     {
118       vis.addPolygonMesh<PointT> (convex_hull->points, convex_hull->faces, "convex_hull");
119     }
120     if (compute_concave_hull)
121     {
122       vis.addPolygonMesh<PointT> (concave_hull->points, concave_hull->faces, "concave_hull");
123     }
124     if (perform_greedy_triangulation)
125     {
126       vis.addPolygonMesh(*greedy_mesh, "greedy_mesh");
127     }
128     if (perform_marching_cubes)
129     {
130       vis.addPolygonMesh(*marching_cubes_mesh, "marching_cubes_mesh");
131     }
132 
133     vis.spin ();
134   }
135 }
136