如何有效地处理3D体素?

时间:2012-03-22 19:14:14

标签: c++ 3d computational-geometry

我有一个拥有数百万点的3D点云。我想将这些点存储在3D体素空间中。沿坐标轴的体素数大于3000(x),4000(y),1500(z),总共3000 * 4000 * 1500体素。我需要存放在体素中;最大点数,最小高度,最大高度和centorid。但是,90%的体素都是空的。因此存储它需要大量内存。实际上,我想在以后搜索每个体素的26个相邻体素。那么在体素空间中存储这些数据并有效访问这些数据的最佳方法是什么?

创建一个多维数组,就性能而言不是最佳解决方案......请提出任何提示?

4 个答案:

答案 0 :(得分:3)

此类数据的经典数据结构为kd-Treesoctrees.

此外,您一定要查看CGAL中实现的spatial searching and sorting数据结构。

答案 1 :(得分:2)

如果它真的“只是”数百万点,那么远远超过90%的体素会被清空。我会尝试从体素坐标到点的散列多图(C ++ 11中的std::unordered_multimap)。这给你O(1)查找,就像一个数组。它带来了相当多的开销,但它可能是最好的折衷方案。

您需要做的唯一事情是体素类中的相等比较和模板特化std::hash<voxel>。您不会以任何自动方式获得“最大点数”,但这是否真的有用?

答案 2 :(得分:1)

一种方法是使用集合中的数据来支持您的实际数据。

举例说明:

struct t_voxel {
  size_t nPoints, minHeight, maxHeight, centorid;
};

struct t_voxel_id {
  uint16_t index;
};

// one dimension
class t_voxel_collection {
  // the actual voxel data needed for the indices represented by the collection of voxelId
  std::vector<t_voxel> d_voxel;
  // here, empty voxel is designated by t_voxel.index = 0
  // this collection is your primary array representation
  // these elements just refer to a unique or shared index in this->d_voxel
  std::vector<t_voxel_id> d_voxelId;
public:
  // >> the interface to access and set, which abstracts the backing collection.
  // and prohibits the client from accessing the actual data.

  t_voxel get(const size_t& idx) const {
    return this->d_voxel[this->d_voxelId[idx].index];
  }
  // ...
};

你可以通过这种方式实现内存消耗的大幅下降(假设你看到了这个方向)。

这不是一个完整的答案,但可以在这种情况下提供帮助。

根据您的使用情况,有多种方法可以进一步优化和共享此集合中的体素数据。

答案 3 :(得分:1)

无论你做什么,即使你找到了稀疏网格的完美内存布局,你仍然会陷入困境 - 这仍然需要太多的内存。真正的问题是能够有效地将其存储在磁盘上并智能地缓存感兴趣的区域。

谢天谢地Field3D就是为此而开发的。