从 .las 文件中读取点云

Posted

技术标签:

【中文标题】从 .las 文件中读取点云【英文标题】:Reading Point Clouds from .las files 【发布时间】:2021-02-10 02:06:30 【问题描述】:

我正在处理一个使用 .las 激光雷达文件的项目。

我google了一下,发现可以用PDAL把.las转成.pcd文件,这样就可以使用PCL库了。

我使用 PDAL 将文件从 .las 转换为 .pcd。

当我尝试使用以下代码读取 pcd 文件时:

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("C:/Users/hedey/OneDrive/Documents/Research_papers/STDF/10_4231_MFQF-Q141/I-65/LiDAR/RoadSurface/PCD/20180524_I65_NB_RoadSurface_7_53.5.pcd", *cloud) == -1) //* load the file

    PCL_ERROR("Couldn't read file test_pcd.pcd \n");
    return (-1);

std::cout << "Loaded "
    << cloud->width * cloud->height
    << " data points from test_pcd.pcd with the following fields: "
    << std::endl;
for (const auto& point : *cloud)
    std::cout << "    " << point.x
    << " " << point.y
    << " " << point.z << std::endl;
return (0);

结果如下,我很惊讶转换后的文件中的所有坐标都是(0,0,0)。这可能有什么问题?

【问题讨论】:

如果您使用的是点云,我不能推荐 CloudCompare。尝试使用它来加载 .las 文件,您也可以使用它来导出。也许它可以在调试过程中为您提供帮助 但是,正如以下链接中突出显示的那样,从 .las 转换为 .pcd 不会保留原始坐标:danielgm.net/cc/forum/viewtopic.php?t=3805、danielgm.net/cc/forum/viewtopic.php?t=2001 我明白了,很有趣。是否可以使 .las 文件可用,以便我看一下?你的 pcl 代码对我来说似乎很好。 感谢您的帮助和支持。 las 文件可在此处获得:dropbox.com/s/p0vkfjb8q25ee07/… 感谢您的 las 文件。我忘了问,你能不能也上传你转换后的 .pcd 文件? 【参考方案1】:

我建议您仔细查看PCD writer documentation,以获取有关此特定转换的一些有用指示。

这里的问题是,虽然双精度浮点数是有效的 PCD,但 PCL 的默认点类型不支持它们。您可以手动编辑已转换的 PCD 文件,将 x、y 和 z 维度的大小从 8 更改为 4。或者您可以重新运行pdal translate,确保在选择字段时设置数据类型和精度您想使用 order 选项进行转换。一个例子看起来像

pdal translate input.las output.pcd --writers.pcd.order="X=Float:2,Y=Float:2,Z=Float:2"

此外,您可能不需要像“ScanAngleRank”这样的额外字段。如果这样做,则需要提供 PCL 点类型支持才能单独处理它们。要删除额外的字段,您可以追加

--writers.pcd.keep_unspecified=false

到之前建议的命令。

最后要记住的是,处理像 UTM 中的大坐标(看起来你就是这样)并将它们存储在单精度中可能会导致一些精度损失。您应该考虑在转换为 PCD 之前偏移数据(可能使用 PDAL 的transformation filter)。

【讨论】:

关于精度损失,我想说这种数据的精度损失太大了,需要偏移。否则,根据位置,点云可能会变得不可用。 非常感谢@chambbj 的详细回答。在使用 order 选项重新运行 pdal translate 后,现在正在读取这些点。我是该领域的新手,我需要您的帮助来指导我,或者请我参考有关如何抵消数据的实用指南? 感谢您的评论@JRR。您能否建议如何进行抵消,因为我是该领域的新手? 我找到了这个关于自动偏移的链接:pdal.io/tutorial/las.html#auto-offset-example。但是,我找不到 pdal 命令来进行偏移。另外,我不确定您是否指的是自动偏移。 这里没有自动的(您找到的示例专门适用于 LAS 编写器)。您可以阅读pdal info,它将提供原始文件的边界作为输出的一部分。转换过滤器在translations 上有一个完整的部分。一种可能的解决方案是通过减去最小 XYZ 值进行平移。但是 PCD 不会存储这些偏移量,因此如果您需要返回原始坐标,显然您必须再次平移。

以上是关于从 .las 文件中读取点云的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB点云处理(二十三):读写LAS点云(lasFileReader | lasFileWriter)

matlab那个版本可以进行点云

读取 .las 文件,用 PCL 处理和显示

点云格式转换:las点云转txt点云(XYZXYZIXYZRGBXYZIRGBGpstime)

点云格式转换:las点云转txt点云(XYZXYZIXYZRGBXYZRGBIGpstime)

从 R 中的 *.las 点云创建正射镶嵌