阅读了两篇不错的帖子 Algorithm for simplifying 3d surface? 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中生成的表面,白色和黑色的表面具有不同的法线方向。
感谢您的任何建议和可能的答案。
答案 0 :(得分:3)
我希望你仍然对答案感兴趣。您可以尝试的一件事是使用点到面距离而不是点到点距离来定义ICP。点对点距离看起来像这样,其中a和b在目标点集中,p是您在ICP中注册的集合中的点。最近的点是a,距离是| a-p |。
a--------b
\
\
p
点到平面的距离是这样的,c是p在线ab上的投影,距离是| c-p |。
a--c-----b
|
|
p
点对面可能有利的原因是在这样的情况下,'。'点数来自一次扫描,“o”点来自另一次扫描。 ICP可能会陷入这样的局部最小值,其中水平线中的。和o完全匹配,而垂直线中的。它不能将'o'移动到左边,因为这样做会增加水平点的错位太多。
. .o .o .o .o .o .o .o
. o
. o
. o
使用点到面距离,当你向左滑动'o'时,你不会从水平点产生错误,所以你不会陷入局部最小值。我已经看到了“洋葱”这样的错误,就像你在ICP中使用点对点距离所描述的那样。
如果可以降低分辨率,那么你可以尝试的另一件事就是聚集你的观点。 Meshlab有一个过滤器可以执行此操作:“过滤器 - >采样 - >群集顶点子采样”。这可能会减少“洋葱般的分层”。
关于你从meshlab中得到的不一致法线,如果你关心的是在meshlab中可视化它们,ctrl-d将打开“双面照明”并消除黑色区域。如果你确实需要一致的法线,那么meshlab有一个引人注目的过滤器叫做“法线,曲率和方向 - >连贯地重新定位所有面孔”,遗憾的是这对我不起作用。根据您拥有的数据类型,特别是它来自范围传感器,您已经知道网格面的法线应指向您的传感器,因此可以轻松地对数据进行后期处理和翻转那些指向错误的方式(看看法线和观察/测量方向的点积的符号)。