2011-03-10 139 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