您现在的位置是:首页 > 正文

PCL- Las文件处理

2024-01-30 22:57:08阅读 0

前言

在对点云数据处理的时候,很多时候激光雷达扫描的文件不一定是.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文件,因此熟悉各种点云数据的解析格式是很有必要的。

网站文章

  • 刚刚出炉的小站,请大家帮忙测试(vs08,linq,sql05开发)+想找个工作

    刚刚出炉的小站,请大家帮忙测试(vs08,linq,sql05开发)偶的技术不怎么滴请大家帮忙测试哈有意见提意见没意见喝茶嘿嘿网址是:http://www.bantool.cn/ 主页面包括的内容:半途心情是---文章 半途留影是---photos 半途拾零----作品展示 半途中人----关于站长 半途留声----留言板另外呢我最...

    2024-01-30 22:56:37
  • Beautiful Soup简介

    BeautifulSoup是一个Python库,用于从HTML或XML文件中提取数据。它提供了一种简单而直观的方式来遍历、搜索和修改HTML或XML文档的结构。以下是一些BeautifulSoup的主...

    2024-01-30 22:56:30
  • Windows11 设置右键创建md文件

    Windows11 设置右键创建md文件

    Windows11 设置右键创建md文件

    2024-01-30 22:56:23
  • dubbo的spi机制

    dubbo的spi机制

    spi

    2024-01-30 22:55:54
  • 企业IPPBX有哪些功能

    一、IPPBX 的定义:基于IP方式进行传输语音的PBX交换机,也交软交换。目前有比较多的厂家也在做着这块的业务,有硬件的,有可以部署在云端的。基于云端的好处是,接入的方式和位置不受地域的限制,只要网...

    2024-01-30 22:55:42
  • MobaXterm连接服务器并运行服务器中的文件

    MobaXterm连接服务器并运行服务器中的文件

    首先连接服务器,点击Sessions再点击SSH,输入服务器的IP地址和服务器用户名即可连接服务器MobaXterm中调用服务器的文件先cd+空格+文件路径可进入这个文件夹接着再进入服务器的编译环境后面直接加路径再+一个空格+运行的文件名.py如下图,即可调用models文件夹下ResNet这个文件并运行...

    2024-01-30 22:55:15
  • [八省联考 2018] 林克卡特树 题解

    这道题我前前后后做了一年,共过了 444 遍,每次都有的新的理解;这次我认为自己理解透了,于是就写了一篇题解。这道题是我入坑看到的第一道黑题(当时很萌,不知道黑题是什么,看到这题感觉很好玩),另外还有...

    2024-01-30 22:55:07
  • webpack的使用方法

    webpack的使用方法

    webpack的使用方法

    2024-01-30 22:54:59
  • XML标记语言:标签和语法规则、利用dom4j对XML进行解析、XML的DTD约束和schema约束;自定义枚举;自定义注解和元注解

    XML标记语言:标签和语法规则、利用dom4j对XML进行解析、XML的DTD约束和schema约束;自定义枚举;自定义注解和元注解

    XML标记语言:标签和语法规则、利用dom4j对XML进行解析、XML的DTD约束和schema约束;自定义枚举;自定义注解和元注解

    2024-01-30 22:54:53
  • 其实你也可以使用SpringBoot自定义starter

    其实你也可以使用SpringBoot自定义starter

    使用过SpringBoot的都应该知道,一个SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表该项目的 SpringBoot 启动依赖,除了官方已有的 Sta...

    2024-01-30 22:54:26