PCL- Las文件处理

2023-05-16

前言

在对点云数据处理的时候,很多时候激光雷达扫描的文件不一定是.pcd文件,这个时候需要进行相关文件处理,如Las,laz,e57等文件格式,本文将介绍las文件的读写.

1.引入包

在对las文件进行解析,首先要安装相应的解析包,其解析包是libLas包,在mac,linux系统下,可通过源码进行安装,如下:

git clone https://github.com/libLAS/libLAS.git
cd libLAS
mkdir build
cd build
cmake ..
make
make install

通过上述命令将libLas包安装到系统中,修改项目中的CMakeLists.txt文件,引入该包如下:

find_package(libLAS REQUIRED)
include_directories(${libLAS_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${libLAS_LIBRARIES})

2.读las文件

template<typename PointT>
        LasScanDevice<PointT>::LasScanDevice(std::string  path):
        filePath(std::move(path)),istream(std::make_shared<std::ifstream>()){
            istream->open(filePath,std::ios::in);
            reader = std::make_shared<liblas::Reader>(*istream);
        }

        template<typename PointT>
        LasScanDevice<PointT>::~LasScanDevice() {
            istream->close();
        }

        template<typename PointT>
        void LasScanDevice<PointT>::readFromFile(pcl::PointCloud<PointT> &out) {
            liblas::Header header = reader->GetHeader();

            out.height = 1;
            out.width = header.GetPointRecordsCount();
            out.resize(out.height * out.width);

            int i = 0;

            while (reader->ReadNextPoint()){
                liblas::Point point = reader->GetPoint();
                liblas::Color color = point.GetColor();
                PointT pointT;

                out.points[i].x = point.GetX();
                out.points[i].y = point.GetY();
                out.points[i].z = point.GetZ();

                out.points[i].r = color.GetRed();
                out.points[i].g = color.GetGreen();
                out.points[i].b = color.GetBlue();

                i++;
            }

            reader->Reset();
        }

如上代码所示,首先在构造函数里面io流打开一个Las文件,在析构函数中将io流关闭。其中有函数readFromFile为读取Las文件流相关内容,并且将点云数据复制到cloud对象中去。
请添加图片描述

3.写Las文件

  auto filename = "";
  std::ofstream ofs(filename,ios::out|ios::binary);
 if (!ofs.is_open()){
            LOG(WARNING) << "Open File ERROR:" << filename;
        }
        liblas::Header header;

        Eigen::Vector4f minPt;
        Eigen::Vector4f maxPt;
        pcl::getMinMax3D<PointT>(*pointCloudPtr,minPt,maxPt);

        header.SetVersionMajor(1);
        header.SetVersionMinor(2);
        header.SetDataFormatId(liblas::ePointFormat3);
        header.SetScale(0.01,0.01,0.01);
        header.SetPointRecordsCount(pointCloudPtr->points.size());
        header.SetPointRecordsByReturnCount(0, pointCloudPtr->points.size());
        header.SetMax(maxPt[0], maxPt[1], maxPt[2]);
        header.SetMin(minPt[0], minPt[1], minPt[2]);

        liblas::Writer writer(ofs,header);
        liblas::Point point(&header);
        writer.SetHeader(header);

        for (auto i = 0;i<pointCloudPtr->size();i++) {
            double x = pointCloudPtr->points[i].x;
            double y = pointCloudPtr->points[i].y;
            double z = pointCloudPtr->points[i].z;
            point.SetColor(liblas::Color(pointCloudPtr->points[i].r,pointCloudPtr->points[i].g,pointCloudPtr->points[i].b));
            point.SetCoordinates(x,y,z);
            writer.WritePoint(point);
        }

上述代码中,先构建Las文件的Header,其中值得注意的地方是设定最大最小的边界,其中可通过PCL库里面getMinMax3D函数获取最大最小的边界,并将其设置到header中。后续即将点云中的点陆陆续续的写进Las文件中去。

总结

本文完成的Las文件的读写,点云数据在传递之中一般按照并非标准的.pcd文件,因此熟悉各种点云数据的解析格式是很有必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL- Las文件处理 的相关文章

随机推荐

  • 1e-7

    1e 7 就是10的负7次方
  • 3维空间中点、线、面之间的数学关系(python代码)

    1 面的定义 三维空间中的平面由两个量确定 xff1a 一个法向量 xff08 垂直于该平面的向量 xff09 一个已知点 xff08 位于该平面上的一个点 2 叉乘和点乘的区别 2 1叉乘的计算方式 xff0c 叉乘用来得到垂直于两条向量
  • 三维空间中,向量在另外一个向量或者面上的投影

    1 向量在另外一个向量上的投影 求向量u在向量v上的投影 定义为u xff0c 为两向量的夹角 一个向量有两个属性 xff0c 大小和方向首先明确向量点乘的含义 u v
  • C++编程02(引用、参数传递、内联函数)

    C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 引用 文章目录 C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 一 引用1 引用的实质2 引用必须初始化3 对数组建立引用 二
  • 使用Git bash查看之前版本和恢复最新版本的方法

    项目场景 xff1a 作为实习生 xff0c 一直在帮公司搞C 43 43 的图像识别项目 xff0c 因为总是改需求 xff0c 所以我的代码注释的一大片 xff0c 不便于整理 xff0c 有时候改的改的 xff0c 就找不到之前的版本
  • Windows平台下CMake使用报错No CMAKE_CXX_COMPILER could be found

    今天在笔记本建立了一个Cmakelists xff0c 使用cmake编译的时候 xff0c 报错 No CMAKE CXX COMPILER could be found No CMAKE C COMPILER could be foun
  • Cartographer编译方法及编译出错(glog库链接错误)解决方法

    最近在重新调试Carto代码 xff0c 想把自己的代码加入到Carto中 xff0c 原本想在IDE中调试 xff0c 然而Carto编译方式比较奇葩 xff08 catkin make isolated install use ninj
  • 什么是RTOS?RTOS与普通操作系统的区别

    一 xff1a 什么是RTOS RTOS Real Time Operating System xff0c 实时操作系统 实时性是其最大特征 xff0c 实时操作系统中都要包含一个实时任务调度器 xff0c 这个任务调度器与其它操作系统的最
  • 进度条(CSS)

    效果 xff08 实际有动态效果 xff09 html span class token tag span class token tag span class token punctuation lt span div span span
  • 终端命令行打开vscode

    在指定文件夹内 xff0c 使用终端命令行打开vscode 在当前目录打开vscode code 如果code命令无法使用 xff0c 需要配路径 xff0c 如下 xff1a 打开bash或者zsh配置文件 bash 用户请使用 vi b
  • 串口缓冲区管理分析

    一 概述 xff1a 串口使用时一般包含两个缓冲区 xff0c 即发送缓冲区和接收缓冲区 发送数据时 xff0c 先将数据存在发送缓冲区 xff0c 然后通过串口发送 xff1b 接收数据时 xff0c 先将接收的数据存在接收缓冲区 xff
  • array element has incomplete type

    http stackoverflow com search q 61 luaL reg 43 incomplete 43 type libs edje lua2 o edje lua2 c 183 error array type has
  • rt-thread学习记录(一)--内核的移植

    rt thread学习记录 xff08 一 xff09 内核的移植 1 基本选择 在rt thread官网上 xff0c 看到其对stm32芯片的支持 xff0c 因此选择stm32c8t6最小系统来进行移植内核 xff0c rt thre
  • rt-thread内核启动分析

    1 项目准备 上一节的基本环境 如rh thread 基本环境的搭建 硬件材料stm32f103C8T6 以及st link rt thread 内核启动官网分析 在分析rt thread代码的时候 由于rt thread的代码是十分优秀的
  • 达梦数据库sql语句记录

    登入 在ubuntu上安装好达梦数据 xff0c 并且生成实例 xff0c 在ubuntu上进行安装目录 xff0c 采用在tools目录下 xff0c 使用 disql进行命令行模式 xff0c 连接服务器 xff1a Conn sysd
  • vertx web开发(一)

    vertx web开发 最近在开发中 xff0c 由于spring 的大而全 xff0c 反而不实用于一下小项目 xff0c 因为spring boot在空载的情况 xff0c 至少其内存占用超过150M 而对于一些简单的项目反到不适用 而
  • kotlin协程实现原理

    传统runnable接口实现 在java中 xff0c 很多耗时的行为通过实现runnable接口 xff0c 并且通过线程运行下这些耗时的任务 xff0c 例如 xff1a span class token keyword public
  • PCL---RANSAC随机采样一致性算法

    前言 通过前面的文章 xff0c 我们基本上代建的相关环境 本文将继续基于此继续学习PCL相关采样一致性算法 基础代码下载 1 准备 1 1 Ransac算法介绍 RANSAC从样本中随机抽选出一个样本子集 xff0c 使用最小方差估计算法
  • PCL-使用potree可视化

    前言 在几篇文章中 xff0c 基本实现了对PCL相关操作 xff0c 最近在github上找到了Web端对点云数据可视化兼容很好的项目 Potree 对此本文将介绍如何使用Potree来进行web端的可视化 1 Potree 官方运行 P
  • PCL- Las文件处理

    前言 在对点云数据处理的时候 xff0c 很多时候激光雷达扫描的文件不一定是 pcd文件 xff0c 这个时候需要进行相关文件处理 xff0c 如Las xff0c laz e57等文件格式 xff0c 本文将介绍las文件的读写 1 引入