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/io/png_io.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.png\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 saveImage (const std::string &filename, const PointCloud<RGB> &image)
00071 {
00072   TicToc tt;
00073   tt.tic ();
00074 
00075   print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
00076   io::savePNGFile (filename, image);
00077 
00078   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", image.width * image.height); print_info (" points]\n");
00079 }
00080 
00081 
00082 int
00083 main (int argc, char** argv)
00084 {
00085   print_info ("Convert the RGB information of an organized PCD file to a PNG image. For more information, use: %s -h\n", argv[0]);
00086 
00087   if (argc < 3)
00088   {
00089     printHelp (argc, argv);
00090     return (-1);
00091   }
00092 
00093   
00094   std::vector<int> pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
00095   if (pcd_file_indices.size () != 1)
00096   {
00097     print_error ("Need one input PCD file and one output PNG file.\n");
00098     return (-1);
00099   }
00100 
00101   std::vector<int> png_file_indices = parse_file_extension_argument (argc, argv, ".png");
00102   if (png_file_indices.size () != 1)
00103   {
00104     print_error ("Need one input PCD file and one output PNG file.\n");
00105     return (-1);
00106   }
00107 
00108   
00109   pcl::PCLPointCloud2 cloud;
00110   if (!loadCloud (argv[pcd_file_indices[0]], cloud))
00111     return (-1);
00112 
00113 
00114   PointCloud<RGB> image;
00115   fromPCLPointCloud2 (cloud, image);
00116 
00117 
00118   
00119   if (!image.isOrganized ())
00120   {
00121     PCL_ERROR ("Input cloud is not organized.\n");
00122     return (-1);
00123   }
00124 
00125   
00126   saveImage (argv[png_file_indices[0]], image);
00127 
00128   return (0);
00129 }
00130