SVO深度解析(三)之深度濾波(建圖部分)


轉載於http://blog.csdn.net/zhubaohua_bupt/article/details/74911000

3.1深度濾波簡介

SVO在建圖部分采用的是深度濾波器,論文中並沒有詳細的介紹。深度濾波在SVO作者寫的另一篇叫REMODE[1]的文章里,介紹了深度濾波的每一個步驟。REMODE[1]這篇文章講的是利用svo提供的位姿,進行三維重建,屬於漸進式三維重建。其過程和SVO深度濾波一樣,只不過在REMODE里,實現用GPU進行了加速處理。

 

SVO深度濾波是利用一系列前后幀,完成對指定幀上像素深度的求取。用一些列幀,來求取指定幀上每個像素深度的原因是,在計算像素點深度時,單次匹配恢復的深度有誤差,需要依靠多次深度測量值的融合,來恢復誤差較小的深度值。SVO把像素的深度誤差模型看做概率分布,有兩個屬性,一個是深度值服從高斯分布,另一個是局外點的概率服從Beta分布,同時融合這兩種屬性。

 

SVO深度濾波對深度進行漸進式融合(動態融合)。其過程可表述如下:

關鍵幀上選取像素點(SVO是fast角點,REMODE是梯度點),作為種子(seed,種子就是深度未收斂的像素點),每來一幀圖像,融合更新一下之前提取的種子,直至種子的深度收斂,這是個動態過程,類似於濾波,大概這就是叫深度濾波的原因吧。如果新的一幀是關鍵幀,那么再次提取新的像素點作為種子。

就這樣舊的種子不斷收斂,新的種子不斷增加,不斷進行下去。

 

下面來探討一下深度濾波的整個過程。

 

3.2 深度濾波分步驟詳細介紹

 

對於一個種子,其每一次深度濾波(也叫深度融合,利用新的一幀來更新種子的深度值),都行需要經以下過程。

 

 

3.2.1 計算極線

 

關於極線的基本知識,本文不做介紹。對於每個種子,在當前幀計算極線的條件是:

<1>已知種子所在幀與當前幀的相對位姿

<2>已知種子的初始深度

 

條件<1>的作用是用來做匹配,由VO提供。

條件<2>的作用是縮小找匹配的搜索量。當種子新提取時,這個時候還沒有深度值,用場景平均深度初始。

 

本文用z表示種子的深度,sigma2表示深度方差,sigma表示深度標准差。

極線的計算方法如下:

 

step1:

   在深度延長線上,構造兩個三維點P1,P2,這兩個三維點來源同一個像素,唯一的不同就是深度,

分別為 P1(x,y,z- n*sigma),P2(x,y,z+ n*sigma),這里n可以調節,一般選擇n=1,2,3(3sigma原則)。

 

Step2:

將P1,P2利用幀間位姿,投影至當前幀,投影點為u1,u2,連接u1,u2就是我們所要計算的極線。

SVO工程里,實現在Matcher.cpp里的findEpipolarMatchDirect()函數里。

 

REMODE工程里,實現在epipolar.cpp seedEpipolarMatchKernel()函數里。

 

 

 

3.2.2 計算仿射矩陣

 

為什么要計算仿射矩陣?

我們知道,同一張圖像在經過旋轉平移后,同一個場景在圖像上的成像位置就發生了變換。

在像素做匹配時,我們需要用像素周圍的信息(一般是矩形窗口)來描述本像素的特征。

設想一下,如果幀間圖像發生了旋轉,我們還用同樣的窗口(當前幀的窗口坐標和種子所在幀窗口坐標一樣)

來描述搜索點,是不是不太合適?

 

 

如上圖,描述p的窗口w1在后幀上投影點為p’,我們在匹配p和p’時,是用藍色窗口來描述p’呢,還是用紅色窗口

答案肯定是紅色窗口,那既然是紅窗口,紅色窗口怎么計算呢?

 

這就會用到仿射矩陣,SVO仿射矩陣是這樣的計算的。

計算窗口的思路是先利用三點法計算出tk和tn兩時刻圖像的仿射變換矩陣,

然后再把窗口w1里的像素坐標逐一映射到圖像tn里,這樣映射的所有坐標就組成了窗口w2。

實現代碼

 

 

3.2.3 搜索匹配

 

跟蹤部分的匹配,是靠特征對齊完成的,不需要極線搜索,這是因為在深度和位姿都比較准確的情況下,

用特征對齊可以完成匹配。

 

但是,深度估計卻不能這樣干,它需要極線搜索,因為深度未知或者深度不確定性太大。

SVO選用ZMSSD,通過8*8矩形patch來描述像素,用於計算種子和當前幀搜索點的相似性。

實際上,在svo搜索匹配過程中,當計算的極線小於兩個像素時,直接采用圖像對齊,

因為這個時候深度不確定較小(可以通過極線的計算方式想一下為什么)。

否則,沿極線以為一個像素為步進單位搜索匹配。代碼在findEpipolarMatchDirect()里,

 

 

3.2.4三角測量恢復深度以及匹配不確定性的計算

 

經過搜索匹配后,能夠得到種子p以及種子p在當前幀上的匹配像素點p’,

通過三角測量,就可以恢復種字p的深度。

原理可以參考 http://blog.csdn.NET/zhubaohua_bupt/article/details/74926111

實現部分:

 

 

多次三角測量的深度是為了,融合得到種子較准確的深。那么既然有融合,不同測量值肯定有不同權重。

不確定性就是用來計算權重的。在SVO中,深度的不確定被認為是,

在匹配時,誤匹配一個像素所帶來的最大深度誤差。

 

其計算很簡單,可以直接看論文。

 

3.2.5 深度融合

 

SVO的融合是不斷利用最新時刻深度的觀測值,來融合上一時刻深度最優值,直至深度收斂。如下圖

 

深度數據具體融合過程的過程如下,

 

3.2.6 平滑去噪

 

這一步在SVO里沒有,在REMODE里,作者加上這一步驟,對深度圖有不錯的去噪平滑效果,如下圖。

 

 

這個就不細說了,因為這一步驟本身與SVO無關,有興趣的話可以看一下論文[1],作者通過構造一個能量函數,

然后迭代優化能量函數,當能量函數最小時,就完成平滑去噪。

 

 至此,我們探討了SVO整個深度濾波。

 

REMODE論文:

[1] MatiaPizzoli,Christian Forster, and Davide Scaramuzza. REMODE: Probabilistic,monocular densereconstruction in real time. In International Conference onRobotics andAutomation (ICRA), pages 2609–2616, Hong Kong,China, June 2014.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM