2011-03-10 138 views
1

看完这两篇好帖后 Algorithm for simplifying 3d surface? https://stackoverflow.com/questions/838761/robust-algorithm-for-surface-reconstruction-from-3d-point-cloud 我还有一个关于表面重建的问题。3D点云处理不需要的重叠表面的表面重建?

我有一些来自距离相机的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中生成的曲面,白色和黑色曲面具有不同的法线方向。 image

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

回答

2

我希望你仍然对答案感兴趣。你可以尝试的一件事是使用点到面的距离而不是点到点的距离来定义你的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 

有了点到平面的距离,你会从水平点不承担任何错误,你滑动“0'的左边,这样你就不会陷入局部最小。我已经看到“洋葱”就像你描述的误差,因为使用ICP与点到点的距离。

你可以尝试的另一件事是聚集你的观点,如果你能忍受降低的分辨率。 Meshlab有一个可以做到这一点的过滤器:“Filters-> Sampling-> Clustered vertex Subsampling”。这可能能够减少“洋葱般的分层”。

关于你从meshlab中得到的不一致的法线,如果你关心的是在meshlab中可视化它们,ctrl-d会打开“双面照明”并消除黑色区域。如果你真的需要一致的法线,meshlab有一个诱人命名的过滤器称为“法线,曲线和方向 - >连贯地重新定向所有面”,这不幸对我不起作用。根据您拥有的数据类型,尤其是来自距离传感器的数据类型,您已经知道网格面的法线应该指向传感器,因此可以很容易地后处理数据并翻转那些指向错误的方向(看标准点和观察/测量方向的点积)。

+1

“Normals,Curvatures and Orientation-> Reorient all faces coherently”也不适用于我。 – elgcom 2011-06-29 06:50:39