稠密重建
-
代碼整體框架:
輸入:圖像,位姿,稀疏點雲
輸出:depth,稠密點雲
-
深度圖計算(ComputeDepthMaps)
-
代碼流程圖:
-
-
-
數據准備:
- 圖像映射:imagesMap用來存放所有輸入的圖像中哪些幀時是可用的,不可用就是no id; data.images存放的是一個用來計算深度圖圖像ID的list。
-
-
-
- 坐標系轉化:世界坐標系到相機坐標系的轉換
-
-
-
- 鄰域幀選擇
-
-
-
-
- 選擇策略:共視點f在兩個圖像V,R的夾角w_n,f在兩個圖像中分辨率的相似性w_s,f在兩個圖像中覆蓋的面積的最小值area,分數計算如下式
- 選擇策略:共視點f在兩個圖像V,R的夾角w_n,f在兩個圖像中分辨率的相似性w_s,f在兩個圖像中覆蓋的面積的最小值area,分數計算如下式
-
-
-
-
-
- 思考1:為什么選擇這三個條件?
- 1.兩個view的靠的越近,越不能提供一個足夠大的baseline來重建高精度模型,因此,通過共視點夾角來間接判斷兩個view的baseline是否足夠大;
- 2.兩個圖像的分辨率如果差別比較大,立體匹配時是有問題的。所以選擇鄰域幀,與當前幀分辨率是否一致也是一個重要的因素;
- 3.重建時,圖像的分辨率越高重建的效果越好,故以共視點覆蓋的圖像面積也作為重要參考條件。
- 思考1:為什么選擇這三個條件?
-
-
-
-
-
- 思考2:第一個參數計算公式如何理解?
-
-
-
-
-
-
- 角度閾值a_{max}默認10,角度低於這個值分數越低,2次方的目的是為增強角度下降帶來的影響。這個公式中並沒有用對角度遠大於10做限制,原因是特征點計算時已經對大角度處理過了,角度比較大時是沒有共視特征點的。
-
-
-
-
-
- 最佳鄰域幀選擇:
-
-
-
-
- 在我們上一步的計算中,每張圖像都選出nMaxViews個鄰域幀,我們現在需要給每張圖像選擇一個最佳鄰域來求解深度圖。故現在求解的問題是:
- 每個view(node)都有n個鄰域(label),優化目標是給每個node選擇一個label使得整體能量最小,這個label就是我們最終給每個view分配的最佳鄰域幀。這個問題就是馬爾科夫隨機場的labeling問題(能量優化問題),其原理我們后續在紋理貼圖講解給每個face選最佳view的時候統一介紹,本節只介紹如何調用。
- 這個能量最小優化問題能量函數構造如下:
- Markov Random Field能量函數:公式中Y是標簽 (label),X是節點(node).UnaryCost:之前計算的score,用平均score歸一化后的值。
- UnaryCost = avgSocre/neighbors[k].score
- PairwiseCost:懲罰兩個node的label相同的情況即不鼓勵任意兩個的view的鄰域相同。如果兩個相同,則給一個很大的值。
- Markov Random Field能量函數:公式中Y是標簽 (label),X是節點(node).UnaryCost:之前計算的score,用平均score歸一化后的值。
- 求解方案:
- 方案一:TRW:Tree - reweighted Message Passing
- 方案二:BP:Belief Propagation
- 參考論文:convergent tree-reweighted message passing for energy minimization
- 在我們上一步的計算中,每張圖像都選出nMaxViews個鄰域幀,我們現在需要給每張圖像選擇一個最佳鄰域來求解深度圖。故現在求解的問題是:
-
-