Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 #include <pcl/PCLPointCloud2.h>
00041 #include <pcl/io/pcd_io.h>
00042 #include <pcl/features/vfh.h>
00043 #include <pcl/console/print.h>
00044 #include <pcl/console/parse.h>
00045 #include <pcl/console/time.h>
00046 
00047 using namespace pcl;
00048 using namespace pcl::io;
00049 using namespace pcl::console;
00050 
00051 void
00052 printHelp (int, char **argv)
00053 {
00054   print_error ("Syntax is: %s input.pcd output.pcd\n", argv[0]);
00055 }
00056 
00057 bool
00058 loadCloud (const std::string &filename, PointCloud<PointNormal> &cloud)
00059 {
00060   TicToc tt;
00061   print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
00062 
00063   tt.tic ();
00064   if (loadPCDFile<PointNormal> (filename, cloud) < 0)
00065     return (false);
00066   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
00067   print_info ("Available dimensions: "); print_value ("%s\n", getFieldsList (cloud).c_str ());
00068 
00069   
00070   std::vector<pcl::PCLPointField> fields;
00071   if (getFieldIndex (cloud, "normal_x", fields) == -1)
00072   {
00073     print_error ("The input dataset does not contain normal information!\n");
00074     return (false);
00075   }
00076   return (true);
00077 }
00078 
00079 void
00080 compute (const PointCloud<PointNormal>::Ptr &input, PointCloud<VFHSignature308> &output)
00081 {
00082   
00083   TicToc tt;
00084   tt.tic ();
00085   
00086   print_highlight (stderr, "Computing ");
00087 
00088   VFHEstimation<PointNormal, PointNormal, VFHSignature308> ne;
00089   ne.setSearchMethod (search::KdTree<PointNormal>::Ptr (new search::KdTree<PointNormal>));
00090   ne.setInputCloud (input);
00091   ne.setInputNormals (input);
00092   
00093   ne.compute (output);
00094 
00095   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
00096 }
00097 
00098 void
00099 saveCloud (const std::string &filename, const PointCloud<VFHSignature308> &output)
00100 {
00101   TicToc tt;
00102   tt.tic ();
00103 
00104   print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
00105   
00106   io::savePCDFile (filename, output, false);
00107   
00108   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", output.width * output.height); print_info (" points]\n");
00109 }
00110 
00111 
00112 int
00113 main (int argc, char** argv)
00114 {
00115   print_info ("Estimate VFH (308) descriptors using pcl::VFHEstimation. For more information, use: %s -h\n", argv[0]);
00116   bool help = false;
00117   parse_argument (argc, argv, "-h", help);
00118   if (argc < 3 || help)
00119   {
00120     printHelp (argc, argv);
00121     return (-1);
00122   }
00123 
00124   
00125   std::vector<int> p_file_indices;
00126   p_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
00127   if (p_file_indices.size () != 2)
00128   {
00129     print_error ("Need one input PCD file and one output PCD file to continue.\n");
00130     return (-1);
00131   }
00132 
00133   
00134   PointCloud<PointNormal>::Ptr cloud (new PointCloud<PointNormal>);
00135   if (!loadCloud (argv[p_file_indices[0]], *cloud)) 
00136     return (-1);
00137 
00138   
00139   PointCloud<VFHSignature308> output;
00140   compute (cloud, output);
00141 
00142   
00143   saveCloud (argv[p_file_indices[1]], output);
00144 }
00145