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