test_segmentation.cpp
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   // Load the input file
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   // Subtract the dominant plane
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   // Cluster points
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   // Save output
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     // If clustering was performed, save only the first (i.e., largest) cluster
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   // Or visualize the result
00063   else
00064   {
00065     pcl::console::print_info ("Starting visualizer... Close window to exit.\n");
00066     pcl::visualization::PCLVisualizer vis;
00067 
00068     // If clustering was performed, display each cluster with a random color
00069     if (cluster_points)
00070     {
00071       for (size_t i = 0; i < cluster_indices.size (); ++i)
00072       {
00073         // Extract the i_th cluster into a new cloud
00074         pcl::PointCloud<pcl::PointXYZ>::Ptr cluster_i (new pcl::PointCloud<pcl::PointXYZ>);
00075         pcl::copyPointCloud (*cloud, cluster_indices[i], *cluster_i);
00076 
00077         // Create a random color
00078         pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> random_color (cluster_i);
00079 
00080         // Create a unique identifier
00081         std::stringstream cluster_id ("cluster");
00082         cluster_id << i;
00083 
00084         // Add the i_th cluster to the visualizer with a random color and a unique identifier
00085         vis.addPointCloud<pcl::PointXYZ> (cluster_i, random_color, cluster_id.str ());
00086       }
00087     }
00088     else
00089     {
00090       // If clustering wasn't performed, just display the cloud
00091       vis.addPointCloud (cloud);
00092     }
00093     vis.resetCamera ();
00094     vis.spin ();
00095   }
00096 
00097   return (0);
00098 }


pcl
Author(s): Open Perception
autogenerated on Wed Aug 26 2015 15:35:55