将PCL XYZ云转换为XY(3D到2D)

时间:2012-12-30 12:34:00

标签: c++ point-clouds point-cloud-library

设置

我有一个PointXYZ类型的PCL点云。我需要将其转换为vector<vector<bool> >类型的网格地图,其中map[x][y]应该为真,如果它至少有一个点的话。地图应代表点云的某个区域(比如20x30单元覆盖点云尺寸x = [ - 10,10],y = [ - 15,15]。

我现在拥有什么

目前我有两种方法:

  1. 扫描所有点并将地图中的相应单元格设置为true。
  2. 将点投影到平面,创建一个Kd树,然后为地图中的每个单元格查询最近点的树,如果它落入单元格,则将单元格设置为true。
  3. 现在,第一种方法适用于小点云:O(n),其中n是点云中的点数。

    我认为第二种方法适用于大型云。最终查询仅为O(m),其中m是地图的大小。然而,构建Kd树并将云投射到平面上应该都是O(n)。

    我认为第二种方法总是更糟,但我会进行测试看看。

    问题

    有没有更好的方法?也许是Octree或Voxel-Grid(二维)的东西?方法一的问题是,我不必要地查看感兴趣区域之外的点。

    在我看来,我不能成为第一个遇到这个问题的人,对吗?

1 个答案:

答案 0 :(得分:3)

如果点云已经“有条理”(例如,如果它是直接来自RGBD传感器),你可以通过巧妙地遍历2D阵列在最佳情况下击败O(N)。有关组织点云的信息,请参阅http://pointclouds.org/documentation/tutorials/basic_structures.php

如果没有组织点云,那么除了点本身之外,点云中没有关于空间组织的信息,因此几乎在每种情况下你都必须触及它们中的每一个。如果地图足够小,你可以在它满了时退出但我不太可能发生这种情况。

如果您对概率结果感到满意,那么您可以通过随机抽样点云来构建地图。