colmap程式碼解讀
clomap是作者在ECCV2016年發表的基於兩個概率的深度值和法線估計的論文(開源),下面就開原始碼Patch_match_cuda.cu檔案做簡單的介紹
- 產生隨機法向量和隨機深度值
- 擾動法向量(產生隨機三個方位角度)和擾動深度值
- 根據畫素座標計算三維空間座標
- 傳播深度(Since depth θl and normal nl define a local planar surface in 3D, we propagate the depth θlprp -1 of the intersection of the ray of the current pixel xl with the local surface of the previous pixel (θl-1; nl-1))
- 計算入射角(當前參考影象的法向量和原始影象的光線的夾角)和夾角(當前參考影象光線和原始影象光線夾角)
- 原始影象和參考影象的單應矩陣
Step1 工作空間的初始化
讀入模型
建立緩衝區
影象下采樣(根據精度來設定取樣後的大小)
法線圖和深度圖的路徑確定
深度圖範圍確定
5.1遍歷模型中的三維點,找出這些點所對的影象ID,依次將這些點投影到對應影象的相機座標系求出對應的深度值
5.2每張影象對應深度範圍 ,升序排序深度值
最小值 = 深度值[size*0.01]
最大值 = 深度值[size*0.99]
最小值 = 最小值*(1-0.25)
最大值 = 最大值*(1+0.25)
Step2待處理的問題problem
獲取model,獲取patchmatch配置,像對個數和影象名字
構造參考影象和原始影象個數結構體
遍歷參考影象,計算重疊度(參考影象和左右原始影象的重疊度,稀疏點的角度出發)計算每幅影象夾角(用影象的投影中心和三維點構成的夾角,然後取出所有順序夾角的75%位置作為最後的夾角)
通過影象的夾角和重疊度,夾角大於閾值的情況下,重疊度按照降序排列獲取重疊度最高的20張影像作為參考影像的原始影像
Step3 獲取cuda個數(API呼叫)
Step4 初始化執行緒池
Step5 向執行緒池仍任務處理
- problem存放原始影象序列和參考影象(緩衝區)深度圖,法線圖
- patchMatchOption對應配置資訊
- 構造 patchMatchCuda
假設 像對 pairCount= 5
3.1按照計算能力設定最好的顯示卡
3.2 初始化參考影象
參考影象分配視訊記憶體、參考影象和分配視訊記憶體、參考影象平方和分配視訊記憶體
轉換行陣列,對參考影象進行濾波
濾波結果:
得到雙邊濾波後的影象,原始影象,雙邊濾波後的畫素平方
3.3初始化原始影象序列
1、顏色影象
2、深度影象
3.4初始化轉換矩陣
四個方向的內參矩陣,投影中心,相對轉換矩陣和平移向量,投影矩陣和逆投影矩陣
3.5初始化工作空間
隨機狀態,深度圖,根據每張影象最小值最大值範圍隨機初始化深度圖W*H,初始化法線圖W*H*3,概率圖W*H* pairCount,前一次概率圖(0.5) W*H* pairCount 初始化代價圖W*H* pairCount
開始執行patchmatch
4.1、計算初始化cost
輸入:代價圖、深度圖、法線圖、參考圖的區域性平方和,參考圖區域性雙邊權重和、空域權重、顏色權重
輸出:代價圖、深度圖、法線圖
細節:求出單應矩陣,對單應矩陣的顏色值求出NCC,NCC 的值給原始影象row col id
4.2、開始迭代
從上到下開始掃描
4.2.1、定義聯合概率函式,計算概率圖(反向資訊)和初始化前向資訊(0.5)
4.2.3 、估算出剩下行計算選擇概率
讀取反向資訊計算概率,並且修正概率
用代價圖計算和前向資訊計算alpha, betal =概率圖
選擇概率用alpha betal 權重球的
計算入射角,夾角,影象塊面積比例對應的概率
取樣概率(ID) = f(選擇概率)*f(s1(入射角))*f(s2(夾角))*f(s3(比例))
歸一化取樣概率並計算累計分佈概率
找出產生隨機值大於累計分佈概率的ID值,累計對應的cost,對剩下的深度值計算對應的cost,找出所有cost最小值對應的深度值和法線,用新的cost來更新選擇概率圖和前向資訊
每張影像,根據深度值求出入射角和夾角,根據這些角度和概率值約束來判斷這張影像是不是穩定點,判斷這些點的個數是否滿足要求來選擇當前深度值和法向量
---------------------
作者:h247932449
來源:CSDN
原文:https://blog.csdn.net/h247932449/article/details/82770200
版權宣告:本文為博主原創文章,轉載請附上博文連結!