2016-11-12 82 views
2

我期待實現RGB-D圖像的模型重構。首選在手機上。對於我來說,這一切都是以TSDF表示完成的。我現在通過分層結構和其他想法衝破了很多論文來加速這一點,但是我的問題是,我仍然不知道如何真正實現這種表示。GLSL截斷簽名距離表示(TSDF)實現

如果我有一個大小爲體積網格,因此n×n的X n和我想在每個像素的符號距離,重量和顏色信息存儲。我唯一的猜測是,我必須爲每個體素位置建立一組離散的點。用GLSL「繪製」所有這些點並計算最近的距離。但是,計算這個n^3次似乎不是很好或有效。

我怎麼能想象實現這樣的TSDF表示?

的問題是,我唯一的想法就是使體素電網簽訂距離的數據存儲。但是對於每個深度圖,我必須再次渲染所有體素並計算所有距離。有什麼方法可以讓它反過來嗎?

所以我不能呈現深度圖和存儲信息的體素網格點?

如何藝術的實際狀態來呈現一種有效的方式這樣一個符號距離的代表性?

回答

6

你是在正確的軌道上,這是一個雄心勃勃的項目,但非常酷的,如果你能做到這一點。

首先,值得一個好主意這些事情是如何工作的。標識TSDF的原始文件由Curless和Levoy提供,並且合理易行 - 副本爲here。有許多後來的變化,但這是起點。

其次,您需要按照您的說法創建nxnxn存儲。這很快就會變大。例如,如果您想要具有RGB數據和浮點數值的400x400x400像素來計算距離和重量,那麼這將是768MB的GPU內存 - 您可能需要檢查移動設備上有多少GPU可用內存。是啊,我說GPU是因爲...

雖然可以實現對CPU玩具的解決方案,你真的需要認真對待GPU編程如果你想有什麼樣的表現。我在英特爾i7 CPU筆記本電腦上構建了一個早期版本。無可否認,我沒有花時間優化它,但需要幾十秒來集成單個深度圖像。如果你想得到實時(30Hz),那麼你需要一些GPU編程。

現在,你有你的TSFD數據表示,你需要做的每一幀:相機在哪裏,在世界對於TSDF

1.工作了座標。 通常假定你是時間t = 0的原點,然後測量相對於前一幀的相對平移和旋轉。執行此操作的最常見方法是使用稱爲迭代最近點(ICP)的算法。您可以自己實現此操作,也可以使用像PCL這樣的庫,但我不確定它們是否具有移動版本。我建議你在沒有這個的情況下開始使用,只需保持相機和場景靜止不動,並在稍後進行移動。

2.將你的深度圖像到TSDF這意味着更新下一個深度圖像的TSDF。你不會丟棄你有的信息,你會將新信息與舊信息合併。 您可以通過在你的TSDF遍歷每個體素做到這一點,:

一)從體素中心的距離摸出相機

b)項目點到你的深度相機的圖像平面得到一個像素座標(使用上述得到的外在照相機位置和照相機,其是易於搜索用於超高動力學固有參數)

c)中查找了在該像素處的深度圖中的深度座標

d)項目這個點回到使用像素x和y座標加上深度的空間e)使用值distance_from_step_d - distance_from_step_a更新當前體素距離的值(更新通常是現有值加上新值的加權平均值)。

您可以對體素顏色使用類似的方法。

將所有深度圖集成到TSDF後,可以通過光線跟蹤或提取ISO表面(3D網格)並在另一個包中查看結果來可視化結果。

A 真的有用的紙張,會讓你在那裏是here。這是一些實際上在PC上實施Kinect Fusion的學生的實驗報告。這幾乎是一步一步的指導,雖然你仍然必須學習CUDA或類似的實現它

你也可以看看我的源代碼GitHub的想法,雖然所有正常的免責聲明適用於適用性。

祝你好運!

3

當我發佈我的其他答案後,我想到了另一種方法,似乎與您的問題的第二部分相匹配,但它絕對不是重構,也不涉及使用TSDF。它實際上是一個可視化,但它很簡單:)

每幀你得到一個RGB和深度圖像。假設這些圖像是註冊的,即RGB圖像中(x,y)處的像素表示與深度圖像中(x,y)處的像素相同的像素,則可以創建使用RGB數據着色的密集點雲。要執行此操作,您需要:

對於深度圖中的每個像素 a)使用攝像機的固有矩陣(K),該點的地圖像素座標和深度值將點投影到3D點b)將相同像素處的RGB值與空間中的該點相關聯

因此,現在您有一個(可能爲640x480)像{x,y,z,r,g,b}}結構的數組,

只需創建一組頂點和渲染點,就可以在GLES上渲染這些圖像。有一個關於如何做到這一點的討論here

用這種方法你扔掉每一幀的數據並從頭開始重做。重要的是,你沒有得到重建的表面,並且你不使用TSDF。你可以得到漂亮的結果,但這不是重建。