点云 PCD 数据格式与 LAS 数据格式相互转换

217 阅读1分钟

pcd转las数据代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <liblas/liblas.hpp>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>



int main()
{
    std::ofstream ofs("C:\\Users\\10704\\Desktop\\dezhou\\原始数据(去除电塔铁轨)\\dezhou1_1-4_icp.las", ios::out | ios::binary);
    if (!ofs.is_open())
    {
        std::cout << "err  to  open  file  las....." << std::endl;

    }

    liblas::Header header;
    header.SetVersionMajor(1);
    header.SetVersionMinor(2);
    header.SetDataFormatId(liblas::ePointFormat3);
    header.SetScale(0.01, 0.01, 0.01);

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile("C:\\Users\\10704\\Desktop\\dezhou\\原始数据(去除电塔铁轨)\\dezhou1_1-4_icp.pcd", *cloud);
    std::cout << "总数:" << cloud->points.size() << std::endl;

    // 初始化最小值和最大值
    double minPt[3] = { cloud->points[0].x, cloud->points[0].y, cloud->points[0].z };
    double maxPt[3] = { cloud->points[0].x, cloud->points[0].y, cloud->points[0].z };


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

    // 写入点云数据并计算最小值和最大值
    for (size_t i = 0; i < cloud->points.size(); i++)
    {
        double x = cloud->points[i].x;
        double y = cloud->points[i].y;
        double z = cloud->points[i].z;

        // 更新最小值和最大值
        if (x < minPt[0]) minPt[0] = x;
        if (y < minPt[1]) minPt[1] = y;
        if (z < minPt[2]) minPt[2] = z;
        if (x > maxPt[0]) maxPt[0] = x;
        if (y > maxPt[1]) maxPt[1] = y;
        if (z > maxPt[2]) maxPt[2] = z;

        point.SetCoordinates(x, y, z);

        writer.WritePoint(point);
    }

    // 设置点记录数和最小最大值
    header.SetPointRecordsCount(static_cast<boost::uint32_t>(cloud->points.size()));
    header.SetPointRecordsByReturnCount(0, static_cast<boost::uint32_t>(cloud->points.size()));
    header.SetMin(minPt[0], minPt[1], minPt[2]);
    header.SetMax(maxPt[0], maxPt[1], maxPt[2]);
    writer.SetHeader(header);

    system("pause");
    return 0;
}

las转pcd代码

#define _CRT_SECURE_NO_WARNINGS
#define NOMINMAX
#include <iostream>
#include "lasreader.hpp"
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int main() {

    // 点云路径
    std::string file_path("C:\\Users\\10704\\Desktop\\dezhou\\原始数据(去除电塔铁轨)\\dezhou1_2-4.las");

    // 打开las文件
    LASreadOpener lasreadopener;
    lasreadopener.set_file_name(file_path.c_str());
    LASreader* lasreader = lasreadopener.open();
    if (lasreader == nullptr)
    {
        std::cout << "Yes" << std::endl;
        system("pause");
        return 0;
    }
    size_t point_count = lasreader->header.number_of_point_records;

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    cloud->width = 1;
    cloud->height = point_count;
    cloud->resize(cloud->width * cloud->height);

    int i = 0;
    while (lasreader->read_point()) {

        double tempx = lasreader->point.get_x();
        double tempy = lasreader->point.get_y();
        double tempz = lasreader->point.get_z();

        (*cloud)[i].x = tempx;
        (*cloud)[i].y = tempy;
        (*cloud)[i].z = tempz;
        i++;
    }

    pcl::io::savePCDFileASCII("C:\\Users\\10704\\Desktop\\dezhou\\原始数据(去除电塔铁轨)\\dezhou1_2-4.pcd", *cloud);
    // 关闭点云流
    lasreader->close();
    delete lasreader;

    system("pause");
    return 0;
}