部落客的源碼位址:https://github.com/sjy234sjy234/KinectFusion-ios
原論文:"KinectFusion: Real-time dense surface mapping and tracking."
KinectFusion算法是三維視覺裡面一個經典的基于深度相機的入門級實時靜态場景重建算法,算法的流程簡單易懂,項目複雜度适中,而且涵蓋三維視覺一些基礎知識細節,适合入門學習。值得一提的是,KinectFusion算法本身的并行度非常高,幾乎每一個步驟都可以使用gpgpu的核函數并行實作。目前,github上已經有PC端的cuda開源實作版本。
部落客此前在ios平台上做metal gpgpu開發,在此整理分享一下KinectFusion算法在ios移動端的metal實作代碼,該代碼是demo版本,目前還不能達到實時運作的效率,但是非常适合ios metal gpgpu的初學者。經測試,如果對程式設計做一些gpgpu方向的優化加速,可以在iphoneX上達到30以上的幀率。
上圖是iphoneX上的運作示例,本文主要先對項目的結構架構做一個系統的介紹。
一、小白需要的前期準備工作
圖形渲染的getting started部分:https://learnopengl.com/
ios metal入門:https://blog.csdn.net/sjy234sjy234/article/details/81812029
齊次坐标與空間變換:https://blog.csdn.net/qq_35976351/article/details/84871397
相機投影:https://blog.csdn.net/rurud/article/details/72823718
KinectFusion原文閱讀——重點了解架構、TSDF、ICP,其它細節對照部落客源碼,很多可以略過
Marching Cube——用于提取TSDF中存儲的網格模型,原文似乎不是用這個
二、項目結構介紹
從文首的源碼連結克隆項目後,用xcode打開,在蘋果真機上直接運作。注意metal相關應用無法在虛拟手機上測試運作,隻能在真機上測試運作。經部落客實測,demo項目在iphone X和iphone SE平台上都可以正常運作。
項目中的主要檔案(夾)有:Utility、FusionProcessor、depth.bin、ViewController.mm。
1、Utility檔案夾
檔案夾中包含了算法中用到的數學計算的實作,包括投影矩陣、空間變換、線性方程求解等等。同時,還包含了ios metal相關的功能檔案。其中,metal相關部分的寫法,與部落客此前的學習ios Metal系列是相同的,可以參考上面準備工作中的連結。
2、FusionProcessor檔案夾
檔案夾包含了KinectFusion的ios metal的實作源碼,在後續的文章中将詳細展開介紹。
3、depth.bin檔案
檔案預存了57幀來自iphoneX深度相機的深度幀,幀尺寸是480x640x2 byte。注意,ios平台的深度相機擷取存儲的是float16的深度資料,即每個深度用2個位元組存儲,而且存儲的值是disparity。如果要擷取深度值,需要進行如下換算,取disparity的倒數:depth = 1.0 / disparity。
4、ViewController.mm
檔案裡面編寫了KinectFusion的運作示例。從depth.bin讀取深度幀資料流,調用KinectFusion的方法逐幀的進行三維幾何重建。
三、總結
綜上,本文介紹了學習KinectFusion之前需要掌握的基礎知識架構,以及部落客的KinectFusion-ios項目的組織結構。後續的文章,會進一步解析在ios平台上,KinectFusion的調用、實作的相關源碼部分。