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 #include <pcl/io/pcd_io.h>
00039 #include <pcl/console/print.h>
00040 #include <pcl/console/parse.h>
00041 #include <pcl/console/time.h>
00042 #include <pcl/common/centroid.h>
00043 
00044 using namespace pcl;
00045 using namespace pcl::io;
00046 using namespace pcl::console;
00047 
00048 void
00049 printHelp (int, char **argv)
00050 {
00051   print_error ("Syntax is: %s input.pcd output.pcd\n", argv[0]);
00052 }
00053 
00054 bool
00055 loadCloud (const std::string &filename, pcl::PCLPointCloud2 &cloud)
00056 {
00057   TicToc tt;
00058   print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
00059 
00060   tt.tic ();
00061   if (loadPCDFile (filename, cloud) < 0)
00062     return (false);
00063   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
00064   print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
00065 
00066   return (true);
00067 }
00068 
00069 void
00070 saveCloud (const std::string &filename, const pcl::PCLPointCloud2 &cloud)
00071 {
00072   TicToc tt;
00073   tt.tic ();
00074 
00075   print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
00076 
00077   pcl::PCDWriter writer;
00078   writer.writeBinaryCompressed (filename, cloud);
00079   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
00080 }
00081 
00082 
00083 int
00084 main (int argc, char** argv)
00085 {
00086   print_info ("Convert a PCD file to PLY format. For more information, use: %s -h\n", argv[0]);
00087 
00088   if (argc < 3)
00089   {
00090     printHelp (argc, argv);
00091     return (-1);
00092   }
00093 
00094   
00095   std::vector<int> pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
00096   if (pcd_file_indices.size () != 2)
00097   {
00098     print_error ("Need one input and one output PCD file.\n");
00099     return (-1);
00100   }
00101 
00102   
00103   pcl::PCLPointCloud2 cloud;
00104   if (!loadCloud (argv[pcd_file_indices[0]], cloud))
00105     return (-1);
00106 
00107   PointCloud<PointXYZ> cloud_xyz, cloud_xyz_demeaned;
00108   fromPCLPointCloud2 (cloud, cloud_xyz);
00109   Eigen::Vector4f centroid;
00110   compute3DCentroid (cloud_xyz, centroid);
00111   demeanPointCloud (cloud_xyz, centroid, cloud_xyz_demeaned);
00112 
00113   pcl::PCLPointCloud2 cloud2_xyz_demeaned;
00114   toPCLPointCloud2 (cloud_xyz_demeaned, cloud2_xyz_demeaned);
00115   pcl::PCLPointCloud2 cloud_out;
00116   concatenateFields (cloud, cloud2_xyz_demeaned, cloud_out);
00117 
00118   
00119   saveCloud (argv[pcd_file_indices[1]], cloud_out);
00120 
00121   return (0);
00122 }
00123