轉載請說明出處:ide
http://blog.csdn.net/zhubaohua_bupt/article/details/74911000函數
SVO在建圖部分採用的是深度濾波器,論文中並無詳細的介紹。深度濾波在SVO做者寫的另外一篇叫REMODE[1]的文章裏,介紹了深度濾波的每個步驟。REMODE[1]這篇文章講的是利用svo提供的位姿,進行三維重建,屬於漸進式三維重建。其過程和SVO深度濾波同樣,只不過在REMODE裏,實現用GPU進行了加速處理。優化
SVO深度濾波是利用一系列的先後幀,完成對指定幀上像素深度的求取。用一些列幀,來求取指定幀上每一個像素深度的緣由是,在計算像素點深度時,單次匹配恢復的深度有偏差,須要依靠屢次深度測量值的融合,來恢復偏差較小的深度值。SVO把像素的深度偏差模型看作機率分佈,有兩個屬性,一個是深度值服從高斯分佈,另外一個是局外點的機率服從Beta分佈,同時融合這兩種屬性。spa
SVO深度濾波對深度進行漸進式融合(動態融合)。其過程可表述以下:.net
關鍵幀上選取像素點(SVO是fast角點,REMODE是梯度點),做爲種子(seed,種子就是深度未收斂的像素點),每來一幀圖像,融合更新一下以前提取的種子,直至種子的深度收斂,這是個動態過程,相似於濾波,大概這就是叫深度濾波的緣由吧。若是新的一幀是關鍵幀,那麼再次提取新的像素點做爲種子。blog
就這樣舊的種子不斷收斂,新的種子不斷增長,不斷進行下去。ip
下面來探討一下深度濾波的整個過程。pip
對於一個種子,其每一次深度濾波(也叫深度融合,利用新的一幀來更新種子的深度值),都行須要經如下過程。io
關於極線的基本知識,本文不作介紹。對於每一個種子,在當前幀計算極線的條件是:ast
<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()函數裏。
爲何要計算仿射矩陣?
咱們知道,同一張圖像在通過旋轉平移後,同一個場景在圖像上的成像位置就發生了變換。
在像素作匹配時,咱們須要用像素周圍的信息(通常是矩形窗口)來描述本像素的特徵。
設想一下,若是幀間圖像發生了旋轉,咱們還用一樣的窗口(當前幀的窗口座標和種子所在幀窗口座標同樣)
來描述搜索點,是否是不太合適?
如上圖,描述p的窗口w1在後幀上投影點爲p’,咱們在匹配p和p’時,是用藍色窗口來描述p’呢,仍是用紅色窗口?
答案確定是紅色窗口,那既然是紅窗口,紅色窗口怎麼計算呢?
這就會用到仿射矩陣,SVO仿射矩陣是這樣的計算的。
計算窗口的思路是先利用三點法計算出tk和tn兩時刻圖像的仿射變換矩陣,
而後再把窗口w1裏的像素座標逐一映射到圖像tn裏,這樣映射的全部座標就組成了窗口w2。
實現代碼
跟蹤部分的匹配,是靠特徵對齊完成的,不須要極線搜索,這是由於在深度和位姿都比較準確的狀況下,
用特徵對齊能夠完成匹配。
可是,深度估計卻不能這樣幹,它須要極線搜索,由於深度未知或者深度不肯定性太大。
SVO選用ZMSSD,經過8*8矩形patch來描述像素,用於計算種子和當前幀搜索點的類似性。
實際上,在svo搜索匹配過程當中,當計算的極線小於兩個像素時,直接採用圖像對齊,
由於這個時候深度不肯定較小(能夠經過極線的計算方式想一下爲何)。
不然,沿極線以爲一個像素爲步進單位搜索匹配。代碼在findEpipolarMatchDirect()裏,
通過搜索匹配後,可以獲得種子p以及種子p在當前幀上的匹配像素點p’,
經過三角測量,就能夠恢復種字p的深度。
原理能夠參考 http://blog.csdn.net/zhubaohua_bupt/article/details/74926111
實現部分:
屢次三角測量的深度是爲了,融合獲得種子較準確的深。那麼既然有融合,不一樣測量值確定有不一樣權重。
不肯定性就是用來計算權重的。在SVO中,深度的不肯定被認爲是,
在匹配時,誤匹配一個像素所帶來的最大深度偏差。
其計算很簡單,能夠直接看論文。
SVO的融合是不斷利用最新時刻深度的觀測值,來融合上一時刻深度最優值,直至深度收斂。以下圖
深度數據具體融合過程的過程以下,
這一步在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.
待續