單目SLAM一般處理流程包括track和map兩部分。所謂的track是用來估計相機的位姿。而map部分就是計算pixel的深度,如果相機的位姿有了,就可以通過三角法(triangulation)確定pixel的深度,把這些計算好深度的pixel放到map里就重建出了三維環境。
http://blog.csdn.net/heyijia0327/article/details/50758944
1 對極幾何
| (高翔7.3講)在正確匹配的基礎上求解相機運動---通過對極幾何列式子的基礎矩陣F或本征矩陣E或單應矩陣H,分解得R,t +(高翔7.5講)單目三角測量得深度 極線幾何約束是一種點對直線的約束,而不是點與點的約束,盡管如此,極線約束給出了對應點重要的約束條件,它將對應點匹配從整幅圖像尋找壓縮到在一條直線上尋找對應點。 在立體視覺測量中,立體匹配(對應點的匹配 )是一項關鍵技術,極線幾何在其中起着重要作用。立體視覺系統中,有兩個攝像機在不同角度拍攝物理空間中的一實體點,在兩副圖像上分別成有有兩個成像點。立體匹配就是已知其中的一個成像點,在另一副圖像上找出該成像點的對應點---極限搜索(高翔13.2講)。極線幾何約束是一種常用的匹配約束技術。 |

![]()


p1=⎛⎝⎜x1y
這時,由共面得到的向量方程可寫成:
(1)

補充:一個向量a叉乘一個向量b可以表示為一個反對稱矩陣乘以向量b的形式這時由向量a表示的反對稱矩陣(skew symmetric matrix)如下:
所以式(1)可以寫成:

本征矩陣的性質:
一個3x3的矩陣是本征矩陣的充要條件是對它奇異值分解后,它有兩個相等的奇異值,並且第三個奇異值為0。
牢記這個性質,它在實際求解本征矩陣時有很重要的意義。
[這個性質的證明見Hartley的著作《Multiple view geometry》的第258頁。]
2 計算本征矩陣E、尺度scale的來由
將矩陣相乘的形式拆開得到
上面這個方程左邊進行任意縮放都不會影響方程的解:

(x0x1x0y
所以E雖然有9個未知數,但是有一個變量E33可以看做是縮放因子,因此實際只有8個未知量,這里就是尺度scale的來由,后面會進一步分析這個尺度。
AX=0,x有8個未知量,需要A的秩等於8,所以至少需要8對匹配點。有了匹配點后,就只需要求解最小二乘問題了,上面這個方程的解就是矩陣A進行SVD分解:
后,
V矩陣最右邊那一列的值。另外如果這些匹配點都在一個平面上那就會出現A的秩小於8的情況,這時會出現多解,會讓你計算的E可能是錯誤的。
上面是計算本征矩陣E的八點法,大家也可以去看看wiki的詳細說明wiki鏈接。
1x0y
在應用的時候,考慮到E矩陣反正已經是縮放了的,所以更多的是直接令奇異值為(1,1,0),程序如下:
有了本征矩陣E,就可以從E中恢復平移t和旋轉R。
3本征矩陣恢復R、T,尺度scale的進一步分析

從R,T的計算公式中可以看到R,T都有兩種情況,組合起來R,T有4種組合方式。由於一組R,T就決定了攝像機光心坐標系C的位姿,所以選擇正確R、T的方式就是,
把所有特征點的深度計算出來,看深度值是不是都大於0,深度都大於0的那組R,T就是正確的。
但是特征點深度怎么計算出來呢?這部分的推導見下一篇博客。 http://blog.csdn.net/heyijia0327/article/details/50774104


這個圖簡單明了的演示了這種平移縮放作用。從圖中也可以看出,由於尺度scale的關系,不同的t,決定了以后計算點P的深度也是不同的,所以恢復的物體深度也是跟尺度scale有關的,這就是論文中常說的結構恢復structure reconstruction,只是恢復了物體的結構框架,而不是實際意義的物體尺寸。
並且要十分注意,每兩對圖像計算E並恢復R,T時,他們的尺度都不是一樣的,本來是同一點,在不同尺寸下,深度不一樣了,這時候地圖map它最頭痛了,所以這個尺度需要統一。
那么如何統一呢?如果你一直采用這種2d-2d匹配計算位姿的方式,那每次計算的t都是在不同尺度下的。我們已經知道出現尺度不一致是由於每次都是用這種計算本征矩陣的方式,而尺度就是在計算E時產生的。所以尺度統一的另一種思路就是后續的位姿估計我不用這種2d-2d計算本征E的方式了,也就說你通過最開始的兩幀圖像計算E恢復了R,T,並通過三角法計算出了深度,那我就有了場景點的3D坐標,后續的視頻序列就可以通過3Dto2d(opencv里的solvePnp)來進行位姿估計,這樣后續的視頻序列就不用計算本征矩陣從而繞過了尺度,所以后續的視頻序列的位姿和最開始的兩幀的尺度是一樣的了。但是,這樣計算又會產生新的問題–scale drift。因為,兩幀間的位姿總會出現誤差,這些誤差積累以后,使得尺度不再統一了,如下圖所示(借用@清華大學王京同學的圖,很容易幫助理解):
隨着相機位姿誤差的積累,地圖中的四個點在第二幀的位置相對於第一幀中來說像是縮小了一樣。位姿誤差累計導致尺度漂移這一點,對照上面講尺度不確定問題時的那個圖就很容易理解。關於如何糾正這個scale drift的問題很多單目slam里都提到了,所以這里不再深入。
相機的軌跡有了,接下來就是structure reconstruction 了。
補充: 特征點匹配(常見的有如下兩種方式)
1. 計算特征點,然后計算特征描述子,通過描述子來進行匹配,優點准確度高,缺點是描述子計算量大。
2. 光流法:在第一幅圖中檢測特征點,使用光流法(Lucas Kanade method)對這些特征點進行跟蹤,得到這些特征點在第二幅圖像中的位置,得到的位置可能和真實特征點所對應的位置有偏差。所以通常的做法是對第二幅圖也檢測特征點,如果檢測到的特征點位置和光流法預測的位置靠近,那就認為這個特征點和第一幅圖中的對應。在相鄰時刻光照條件幾乎不變的條件下(特別是單目slam的情形),光流法匹配是個不錯的選擇,它不需要計算特征描述子,計算量更小。

