LASlib 是 Martin Isenburg 编写的 LAStools 的核心 C++ 库,专门用于 LAS/LAZ 格式点云文件的读写。LAS 是 ASPRS(美国摄影测量与遥感学会)定义的标准点云格式,广泛应用于 LiDAR 激光雷达 数据存储。

LAZ 是 LAS 的压缩格式(体积更小)。

LASlib 主要功能:

  • 高效读取大规模 LAS/LAZ 文件(逐点读取,支持流式处理,避免内存溢出)

  • 支持 写入(可保存点云到标准 LAS/LAZ 格式)

  • 自动处理 坐标缩放、偏移、RGB、强度、回波次数、GPS 时间 等元信息

LASlib 在点云学习中的重要性,就像 OpenCV 之于图像学习,既是数据读写的工具,也是保证数据完整性和可交换性的标准化接口。紧接主题:

第一步:下载LASlib

下载地址:LAStools/LAStools: efficient tools for LiDAR processing

第二步:Cmake编译LASlib

下载之后,用Cmake打开:相较于VTK编译,这个简单很多,同样第二个依旧是选择编译后头文件的地址。

这里的CMAKE_INSTALL_PREFIX选项路径是保存生成的LASlib头文件的路径。自己可以给定。

依旧是Open Project,这里先生成12,12成功之后再生成45。

若是生成12存在问题,在这里的问题需要具体分析。

进入到刚才的路径可以看到头文件生成已经成功了。

第三步: 链接Laslib库

将下述的路径加入之前的pri文件。

这个路径下放了一些laz文件以供测试。

下面给出一段测试代码:

#include <QApplication>
#include <QSurfaceFormat>
#include <QVTKOpenGLStereoWidget.h>

#include <vtkSmartPointer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkUnsignedCharArray.h>
#include <vtkPointData.h>
#include <lasreader.hpp>
#include <iostream>
#include <limits>

int main(int argc, char* argv[])
{
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLStereoWidget::defaultFormat());
    QApplication app(argc, argv);
    QVTKOpenGLStereoWidget vtkWidget;
    vtkWidget.resize(1200, 800);
    auto renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    auto renderer = vtkSmartPointer<vtkRenderer>::New();
    renderWindow->AddRenderer(renderer);
    vtkWidget.setRenderWindow(renderWindow);
    // ===== 读取 LAZ 文件 =====
    LASreadOpener opener;
    opener.set_file_name("D:\\PCL\\LAStools-master\\data\\house.laz");
    LASreader* lasreader = opener.open();
    cout<<(int)lasreader->header.number_of_point_records<<endl;
    if (!lasreader) {
        std::cerr << "Failed to open LAZ file!" << std::endl;
        return -1;
    }
    auto points = vtkSmartPointer<vtkPoints>::New();
    double z_min = std::numeric_limits<double>::max();
    double z_max = std::numeric_limits<double>::lowest();
    int point_count = 0;
    while (lasreader->read_point()) {
        double x = lasreader->point.get_X() * lasreader->header.x_scale_factor + lasreader->header.x_offset;
        double y = lasreader->point.get_Y() * lasreader->header.y_scale_factor + lasreader->header.y_offset;
        double z = lasreader->point.get_Z() * lasreader->header.z_scale_factor + lasreader->header.z_offset;
        if (!std::isfinite(x) || !std::isfinite(y) || !std::isfinite(z)) continue;
        points->InsertNextPoint(x, y, z);
        if (z < z_min) z_min = z;
        if (z > z_max) z_max = z;
        point_count++;
    }
    lasreader->close();
    delete lasreader;
    std::cout << "Loaded points: " << point_count << std::endl;
    auto polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    // ===== 高度映射颜色 =====
    auto colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
    colors->SetNumberOfComponents(3); // RGB
    colors->SetName("Colors");
    for (vtkIdType i = 0; i < points->GetNumberOfPoints(); i++) {
        double p[3];
        points->GetPoint(i, p);
        double ratio = (p[2] - z_min) / (z_max - z_min); // 归一化到0-1
        unsigned char r = static_cast<unsigned char>(ratio * 255);
        unsigned char g = static_cast<unsigned char>((1.0 - ratio) * 255);
        unsigned char b = 128; // 固定蓝色值,也可以动态映射
        colors->InsertNextTuple3(r,g,b);
    }
    polyData->GetPointData()->SetScalars(colors);
    // ===== VertexGlyphFilter 显示点 =====
    auto glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
    glyphFilter->SetInputData(polyData);
    glyphFilter->Update();
    auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(glyphFilter->GetOutputPort());
    mapper->ScalarVisibilityOn(); // 启用颜色映射
    auto actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetPointSize(2);
    renderer->AddActor(actor);
    renderer->SetBackground(0.0, 0.0, 0.0);
    renderer->ResetCamera();
    vtkWidget.show();
    return app.exec();
}

这里用的是"D:\\PCL\\LAStools-master\\data\\house.laz"

这样LAS库就配置好了。下一步就是系统的学习PCL库。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐