Win系统下配置PCL库第四步之LASlib文件配置(超详细)
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); // RGBcolors->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-1unsigned 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库。