开启左侧

PLY、LAS等常见数据格式与PCD的转换

[复制链接]
绝地武士 发表于 2020-8-27 12:21:14 | 显示全部楼层 |阅读模式
LAS是美国摄影测量与遥测协会(ASPRS)所创建和维护的行业格式。LAS是一种用于激光雷达数据交换的已发布标准文件格式,它它保留与激光雷达数据相关的特定信息。
LibLAS(https://www.liblas.org/)是一套用于处理常见的"LAS"LiDAR格式数据的C/C++函数库。

LAS转PCD代码:
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <liblas/liblas.hpp>
  4. #include <pcl/io/io.h>
  5. #include <pcl/io/pcd_io.h>
  6. #include <pcl/point_types.h>

  7. using namespace std;

  8. int main (int argc, char** argv)
  9. {
  10.     std::ifstream ifs(argv[1], std::ios::in | std::ios::binary); // 打开las文件
  11.     liblas::ReaderFactory f;
  12.     liblas::Reader reader = f.CreateWithStream(ifs); // 读取las文件

  13.         unsigned long int nbPoints=reader.GetHeader().GetPointRecordsCount();//获取las数据点的个数

  14.         pcl::PointCloud<pcl::PointXYZRGB> cloud;
  15.         cloud.width    = nbPoints;        //保证与las数据点的个数一致        
  16.         cloud.height   = 1;                        
  17.         cloud.is_dense = false;
  18.         cloud.points.resize (cloud.width * cloud.height);

  19.         int i=0;                                
  20.         uint16_t r1, g1, b1;        
  21.         int r2, g2, b2;                        
  22.         uint32_t rgb;                        

  23.         while(reader.ReadNextPoint())
  24.         {
  25.                 // 获取las数据的x,y,z信息
  26.                 cloud.points[i].x = (reader.GetPoint().GetX());
  27.             cloud.points[i].y = (reader.GetPoint().GetY());
  28.             cloud.points[i].z = (reader.GetPoint().GetZ());
  29.                
  30.                 //获取las数据的r,g,b信息
  31.                 r1 = (reader.GetPoint().GetColor().GetRed());
  32.                 g1 = (reader.GetPoint().GetColor().GetGreen());
  33.                 b1 = (reader.GetPoint().GetColor().GetBlue());
  34.                 r2 = ceil(((float)r1/65536)*(float)256);
  35.                 g2 = ceil(((float)g1/65536)*(float)256);
  36.                 b2 = ceil(((float)b1/65536)*(float)256);
  37.                 rgb = ((int)r2) << 16 | ((int)g2) << 8 | ((int)b2);
  38.                 cloud.points[i].rgb = *reinterpret_cast<float*>(&rgb);
  39.                                        
  40.                 i++;
  41.         }
  42.   
  43.         pcl::io::savePCDFileASCII ("pointcloud.pcd", cloud);//存储为pcd类型文件
  44.         return (0);
  45. }
复制代码


PLY转PCD代码:


  1. #include <pcl/io/pcd_io.h>
  2. #include <pcl/io/ply_io.h>
  3. #include <pcl/console/print.h>
  4. #include <pcl/console/parse.h>
  5. #include <pcl/console/time.h>

  6. using namespace pcl;
  7. using namespace pcl::io;
  8. using namespace pcl::console;

  9. void
  10. printHelp (int, char **argv)
  11. {
  12.   print_error ("Syntax is: %s [-format 0|1] input.ply output.pcd\n", argv[0]);
  13. }

  14. bool
  15. loadCloud (const std::string &filename, pcl::PCLPointCloud2 &cloud)
  16. {
  17.   TicToc tt;
  18.   print_highlight ("Loading "); print_value ("%s ", filename.c_str ());

  19.   pcl::PLYReader reader;
  20.   tt.tic ();
  21.   if (reader.read (filename, cloud) < 0)
  22.     return (false);
  23.   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
  24.   print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());

  25.   return (true);
  26. }

  27. void
  28. saveCloud (const std::string &filename, const pcl::PCLPointCloud2 &cloud, bool format)
  29. {
  30.   TicToc tt;
  31.   tt.tic ();

  32.   print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
  33.   
  34.   pcl::PCDWriter writer;
  35.   writer.write (filename, cloud, Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), format);
  36.   
  37.   print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
  38. }

  39. /* ---[ */
  40. int
  41. main (int argc, char** argv)
  42. {
  43.   print_info ("Convert a PLY file to PCD format. For more information, use: %s -h\n", argv[0]);

  44.   if (argc < 3)
  45.   {
  46.     printHelp (argc, argv);
  47.     return (-1);
  48.   }

  49.   // Parse the command line arguments for .pcd and .ply files
  50.   std::vector<int> pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
  51.   std::vector<int> ply_file_indices = parse_file_extension_argument (argc, argv, ".ply");
  52.   if (pcd_file_indices.size () != 1 || ply_file_indices.size () != 1)
  53.   {
  54.     print_error ("Need one input PLY file and one output PCD file.\n");
  55.     return (-1);
  56.   }

  57.   // Command line parsing
  58.   bool format = 1;
  59.   parse_argument (argc, argv, "-format", format);
  60.   print_info ("PCD output format: "); print_value ("%s\n", (format ? "binary" : "ascii"));

  61.   // Load the first file
  62.   pcl::PCLPointCloud2 cloud;
  63.   if (!loadCloud (argv[ply_file_indices[0]], cloud))
  64.     return (-1);

  65.   // Convert to PLY and save
  66.   saveCloud (argv[pcd_file_indices[0]], cloud, format);

  67.   return (0);
  68. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表