我正在做一个使用.las激光雷达文件的项目。
我谷歌了一下,发现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)。这可能有什么问题?
发布于 2020-10-29 14:57:25
我建议您仔细查看PCD编写文档,以获得用于此特定转换的一些有用的指针。
这里的问题是,虽然双精度浮点数是有效的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的变换滤波器)。
https://stackoverflow.com/questions/64560467
复制相似问题