1

在阅读了两个不错的帖子后 简化 3d 表面的算法? https://stackoverflow.com/questions/838761/robust-algorithm-for-surface-reconstruction-from-3d-point-cloud 我还有一个关于表面重建的问题。

我有一些来自测距相机的 3d 点云数据。这意味着点云数据是嘈杂的,只有坐标 (x,y,z) 信息,并且只表示扫描场景的部分表面(又名 2.5D 数据)。

在尝试对它们进行网格化之前,我运行了一些对齐算法(例如 ICP)将多个范围数据合并为一个。不知何故,对齐并不完美,它让合并数据集有一些重叠不好的表面伪影,整个数据变得更加嘈杂!

这是一个插图。

here are points representing a surface (shown as a line)
.....................................................  


here are points representing actually the same surface as the one above,
but due to imperfect alignment of multiple data sets they seem overlapping like onion shell.
............................
  .............................
                   ...............................
              .......................................

算法(例如球旋转、泊松、行进立方体)可以处理这种情况吗?还是我需要一些预处理来使数据集更薄以减少重叠表面?

顺便说一句,我已经尝试使用 MeshLab 仅使用球旋转来从此类数据集中重建表面。它可以工作,但是某些表面法线是在错误的方向上生成的。我认为重叠点会导致这样的问题。

MeshLab中生成的曲面,黑白曲面法线方向不同。 图片

感谢您的任何建议和可能的答案。

4

1 回答 1

3

我希望你仍然对答案感兴趣。您可以尝试的一件事是使用点到平面距离而不是点到点距离来定义 ICP。点对点距离如下所示,其中 a 和 b 在目标点集中,p 是您在 ICP 注册的集中的点。最近的点是a,距离是|ap|。

a--------b
 \
  \
   p

点到平面的距离是这样的,c是p到直线ab上的投影,距离是|cp|。

a--c-----b
   |
   |
   p

点到平面可能有优势的原因是在这样的情况下,其中 '.' 点来自一次扫描,“o”点来自另一次。ICP 可能会陷入这样的局部最小值,其中水平线上的 . 和 o 完美匹配,但垂直线上的不匹配。它不能将 'o' 向左“移动”,因为这样做会过多地增加水平点的错位。

.   .o   .o   .o   .o   .o   .o   .o
.  o
.  o
.  o

对于点到平面的距离,当您将 'o' 向左滑动时,水平点不会出现错误,因此您不会陷入该局部最小值。由于使用 ICP 的点对点距离,我已经看到了您描述的类似“洋葱”的错误。

如果您可以忍受分辨率的降低,您可以尝试的另一件事是对您的点进行聚类。Meshlab 有一个过滤器可以做到这一点:“Filters->Sampling->Clustered vertex Subsampling”。那也许可以减少“洋葱状分层”。

关于你从meshlab中得到的不一致的法线,如果你只关心在meshlab中可视化它们,ctrl-d将打开“双面照明”并消除黑色区域。如果您确实需要一致的法线,meshlab 有一个名为“Normals, Curvatures and Orientation-> Reorient all faces coherent”的迷人过滤器,不幸的是它对我不起作用。根据您拥有的数据类型,特别是如果它来自距离传感器,那么您已经知道网格面的法线应该指向您的传感器,因此很容易对数据进行后处理和翻转那些指向错误的方向(查看法线的点积符号和观察/测量方向)。

于 2011-06-28T17:42:56.550 回答