上一篇文章中,我們介紹了單目SLAM中的三角化恢復三維點深度的原理,本篇文章我們來聊一聊三角化深度值的誤差分析。
目錄:
(1)三角化所帶來的誤差的提出
(2)三角化中誤差的來源分析
(3)如何減小三角化所帶來的誤差
(4)三角化所遇到的奇異情況
(1)三角化所帶來的誤差的提出
上一篇文章中,我們提到了兩幀圖像中的特征點坐標三角化得到空間點的三維信息。
今天,我們來分析一下三角化得到的三維信息中深度的誤差。
如上圖所示:
P為空間中的一個三維點,p1和p2分別為在兩個位置處,攝像機觀察到的投影的二維點坐標。
l2為p1在第二幅圖中所對應的極線(極線的概念請參考立體視覺中的對極幾何,這里不再贅述)。
現在,我們要探討的是:
如果我們在l2進行極線搜索時,所找到的p2'點與真實的p2點有一個像素的誤差,那么會給三角化后的三維點P的深度z帶來多大的誤差。
首先,根據上圖,我們可以得到向量之間的關系,以及三角化中的兩個夾角的定義:
a = p - t 公式(1)
α = arccos<p, t> 公式(2)
β = arccos<a, -t> 公式(3)
其中,a, p, t均為向量,α和β為圖中所示的兩個夾角。
如果此時,我們求取的p2'點與p2點有一個像素的偏差,同時,這一個像素的偏差又會給β帶來δβ的角度變化,我們利用β'來表示對β進行δβ擾動后的新的角度。
設相機的焦距為f,則:
公式(4):
公式(5):
公式(6):
至此,加入擾動后的所有新的角度我們都求出來了。
由正弦定理,我們可以得到:
公式(7):
則由第二個位置上的二維點的一個像素的誤差,可能導致的三角化后深度的誤差為:
δp = ||p|| - ||p'||
這里的δp其實也正是深度的一個均方差(不確定度σobs),這個不確定度是我們后面要介紹的深度濾波器的一個很重要的概念,深度濾波器的目的也正是要不斷減小這個不確定度,使得深度的不確定度最后能夠收斂到一個能夠接受的值。
(2)三角化中誤差的來源分析
上面分析了第二幅圖中的特征點p2的誤差是如何影響三角化后的深度值的。
下面,我們來指出三角化的誤差來源有哪幾方面:
a.圖像的分辨率:圖像的分辨率越高,一個像素所帶來的δβ就越小。
b.特征點求取時的精度:是否做到亞像素,在亞像素的基礎上,誤差有多大?
c.p1點的誤差:會引起極線l2的誤差,從而間接地影響p2點的精度。
d.相機兩次位置的平移向量t的大小:t的模的大小也代表了對極幾何中的基線長度,由公式(7)可以看出基線長度越大,三角化的誤差越小。
(3)如何減小三角化所帶來的誤差
根據【(2)三角化中誤差的來源分析】中所分析的一些因素可知,要想減小三角化過程中引入的誤差,可以有如下幾個方法:
a.選取盡可能高分辨率的相機。
b.進行亞像素的優化(比如在極線搜索時對像素點坐標進行雙線性插值)
// 雙線性灰度插值 inline double getBilinearInterpolatedValue( const Mat& img, const Vector2d& pt ) { uchar* d = & img.data[ int(pt(1,0))*img.step+int(pt(0,0)) ]; double xx = pt(0,0) - floor(pt(0,0)); double yy = pt(1,0) - floor(pt(1,0)); return (( 1-xx ) * ( 1-yy ) * double(d[0]) + xx* ( 1-yy ) * double(d[1]) + ( 1-xx ) *yy* double(d[img.step]) + xx*yy*double(d[img.step+1]))/255.0; }
(關於雙線性插值,這篇文章做了比較清晰的講解:http://blog.163.com/guohuanhuan_cool@126/blog/static/167614238201161525538402/)
c.同樣使用亞像素級的圖像處理算法來處理p1點。
d.在不丟失特征點的情況下,讓平移量t盡量大。
(4)三角化所遇到的奇異情況
由上面的公式推導我們可以看出,三角化中,必須要有平移量t,否則無法構成三角形,進行三角化。
所以在有些單目的SLAM,AR/VR的場景中,有經驗的人都會有意識地將設備或者相機進行一定量的平移,而不會在原地進行純旋轉。
總結一下,我們今天分析了三角化過程中的誤差有哪些,並從理論上對誤差進行了量化的推導。同時,我們還分析了如果減小三角化過程中的誤差。
下一篇文章,我們將會帶着大家一起分析深度濾波器的原理。敬請期待!