从 .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)
点云格式转换:las点云转txt点云(XYZXYZIXYZRGBXYZIRGBGpstime)