LAS是美国摄影测量与遥测协会(ASPRS)所创建和维护的行业格式。LAS是一种用于激光雷达数据交换的已发布标准文件格式,它它保留与激光雷达数据相关的特定信息。
LibLAS(https://www.liblas.org/)是一套用于处理常见的"LAS"LiDAR格式数据的C/C++函数库。
LAS转PCD代码:
- #include <iostream>
- #include <cstdlib>
- #include <liblas/liblas.hpp>
- #include <pcl/io/io.h>
- #include <pcl/io/pcd_io.h>
- #include <pcl/point_types.h>
- using namespace std;
- int main (int argc, char** argv)
- {
- std::ifstream ifs(argv[1], std::ios::in | std::ios::binary); // 打开las文件
- liblas::ReaderFactory f;
- liblas::Reader reader = f.CreateWithStream(ifs); // 读取las文件
- unsigned long int nbPoints=reader.GetHeader().GetPointRecordsCount();//获取las数据点的个数
- pcl::PointCloud<pcl::PointXYZRGB> cloud;
- cloud.width = nbPoints; //保证与las数据点的个数一致
- cloud.height = 1;
- cloud.is_dense = false;
- cloud.points.resize (cloud.width * cloud.height);
- int i=0;
- uint16_t r1, g1, b1;
- int r2, g2, b2;
- uint32_t rgb;
- while(reader.ReadNextPoint())
- {
- // 获取las数据的x,y,z信息
- cloud.points[i].x = (reader.GetPoint().GetX());
- cloud.points[i].y = (reader.GetPoint().GetY());
- cloud.points[i].z = (reader.GetPoint().GetZ());
-
- //获取las数据的r,g,b信息
- r1 = (reader.GetPoint().GetColor().GetRed());
- g1 = (reader.GetPoint().GetColor().GetGreen());
- b1 = (reader.GetPoint().GetColor().GetBlue());
- r2 = ceil(((float)r1/65536)*(float)256);
- g2 = ceil(((float)g1/65536)*(float)256);
- b2 = ceil(((float)b1/65536)*(float)256);
- rgb = ((int)r2) << 16 | ((int)g2) << 8 | ((int)b2);
- cloud.points[i].rgb = *reinterpret_cast<float*>(&rgb);
-
- i++;
- }
-
- pcl::io::savePCDFileASCII ("pointcloud.pcd", cloud);//存储为pcd类型文件
- return (0);
- }
复制代码
PLY转PCD代码:
- #include <pcl/io/pcd_io.h>
- #include <pcl/io/ply_io.h>
- #include <pcl/console/print.h>
- #include <pcl/console/parse.h>
- #include <pcl/console/time.h>
- using namespace pcl;
- using namespace pcl::io;
- using namespace pcl::console;
- void
- printHelp (int, char **argv)
- {
- print_error ("Syntax is: %s [-format 0|1] input.ply output.pcd\n", argv[0]);
- }
- bool
- loadCloud (const std::string &filename, pcl::PCLPointCloud2 &cloud)
- {
- TicToc tt;
- print_highlight ("Loading "); print_value ("%s ", filename.c_str ());
- pcl::PLYReader reader;
- tt.tic ();
- if (reader.read (filename, cloud) < 0)
- return (false);
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
- print_info ("Available dimensions: "); print_value ("%s\n", pcl::getFieldsList (cloud).c_str ());
- return (true);
- }
- void
- saveCloud (const std::string &filename, const pcl::PCLPointCloud2 &cloud, bool format)
- {
- TicToc tt;
- tt.tic ();
- print_highlight ("Saving "); print_value ("%s ", filename.c_str ());
-
- pcl::PCDWriter writer;
- writer.write (filename, cloud, Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), format);
-
- print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms : "); print_value ("%d", cloud.width * cloud.height); print_info (" points]\n");
- }
- /* ---[ */
- int
- main (int argc, char** argv)
- {
- print_info ("Convert a PLY file to PCD format. For more information, use: %s -h\n", argv[0]);
- if (argc < 3)
- {
- printHelp (argc, argv);
- return (-1);
- }
- // Parse the command line arguments for .pcd and .ply files
- std::vector<int> pcd_file_indices = parse_file_extension_argument (argc, argv, ".pcd");
- std::vector<int> ply_file_indices = parse_file_extension_argument (argc, argv, ".ply");
- if (pcd_file_indices.size () != 1 || ply_file_indices.size () != 1)
- {
- print_error ("Need one input PLY file and one output PCD file.\n");
- return (-1);
- }
- // Command line parsing
- bool format = 1;
- parse_argument (argc, argv, "-format", format);
- print_info ("PCD output format: "); print_value ("%s\n", (format ? "binary" : "ascii"));
- // Load the first file
- pcl::PCLPointCloud2 cloud;
- if (!loadCloud (argv[ply_file_indices[0]], cloud))
- return (-1);
- // Convert to PLY and save
- saveCloud (argv[pcd_file_indices[0]], cloud, format);
- return (0);
- }
复制代码 |