Go to the documentation of this file.00001 #include "segmentation.h"
00002
00003 #include <string>
00004 #include <sstream>
00005 #include <pcl/console/parse.h>
00006 #include <pcl/io/pcd_io.h>
00007 #include <pcl/visualization/pcl_visualizer.h>
00008
00009 int
00010 main (int argc, char ** argv)
00011 {
00012 if (argc < 2)
00013 {
00014 pcl::console::print_info ("Syntax is: %s input.pcd <options>\n", argv[0]);
00015 pcl::console::print_info (" where options are:\n");
00016 pcl::console::print_info (" -p dist_threshold,max_iters ..... Subtract the dominant plane\n");
00017 pcl::console::print_info (" -c tolerance,min_size,max_size ... Cluster points\n");
00018 pcl::console::print_info (" -s output.pcd .................... Save the largest cluster\n");
00019 return (1);
00020 }
00021
00022
00023 PointCloudPtr cloud (new PointCloud);
00024 pcl::io::loadPCDFile (argv[1], *cloud);
00025 pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], cloud->size ());
00026
00027
00028 double dist_threshold, max_iters;
00029 bool subtract_plane = pcl::console::parse_2x_arguments (argc, argv, "-p", dist_threshold, max_iters) > 0;
00030 if (subtract_plane)
00031 {
00032 size_t n = cloud->size ();
00033 cloud = findAndSubtractPlane (cloud, dist_threshold, (int)max_iters);
00034 pcl::console::print_info ("Subtracted %zu points along the detected plane\n", n - cloud->size ());
00035 }
00036
00037
00038 double tolerance, min_size, max_size;
00039 std::vector<pcl::PointIndices> cluster_indices;
00040 bool cluster_points = pcl::console::parse_3x_arguments (argc, argv, "-c", tolerance, min_size, max_size) > 0;
00041 if (cluster_points)
00042 {
00043 clusterObjects (cloud, tolerance, (int)min_size, (int)max_size, cluster_indices);
00044 pcl::console::print_info ("Found %zu clusters\n", cluster_indices.size ());
00045 }
00046
00047
00048 std::string output_filename;
00049 bool save_cloud = pcl::console::parse_argument (argc, argv, "-s", output_filename) > 0;
00050 if (save_cloud)
00051 {
00052
00053 if (cluster_points)
00054 {
00055 PointCloudPtr temp_cloud (new PointCloud);
00056 pcl::copyPointCloud (*cloud, cluster_indices[0], *temp_cloud);
00057 cloud = temp_cloud;
00058 }
00059 pcl::console::print_info ("Saving result as %s...\n", output_filename.c_str ());
00060 pcl::io::savePCDFile (output_filename, *cloud);
00061 }
00062
00063 else
00064 {
00065 pcl::console::print_info ("Starting visualizer... Close window to exit.\n");
00066 pcl::visualization::PCLVisualizer vis;
00067
00068
00069 if (cluster_points)
00070 {
00071 for (size_t i = 0; i < cluster_indices.size (); ++i)
00072 {
00073
00074 pcl::PointCloud<pcl::PointXYZ>::Ptr cluster_i (new pcl::PointCloud<pcl::PointXYZ>);
00075 pcl::copyPointCloud (*cloud, cluster_indices[i], *cluster_i);
00076
00077
00078 pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> random_color (cluster_i);
00079
00080
00081 std::stringstream cluster_id ("cluster");
00082 cluster_id << i;
00083
00084
00085 vis.addPointCloud<pcl::PointXYZ> (cluster_i, random_color, cluster_id.str ());
00086 }
00087 }
00088 else
00089 {
00090
00091 vis.addPointCloud (cloud);
00092 }
00093 vis.resetCamera ();
00094 vis.spin ();
00095 }
00096
00097 return (0);
00098 }