1. 程式人生 > >視覺 SLAM 十四講

視覺 SLAM 十四講

第 5 講 相機與影象

本節目標

1. 理解針孔相機的模型、內參與徑向畸變引數。
2. 理解一個空間點是如何投影到相機成像平面的。
3. 掌握 OpenCV 的影象儲存與表達方式。
4. 學會基本的攝像頭標定方法。

本講,我們要討論“機器人如何觀測外部世界”,也就是觀測方程部分。而在以相機為主的視覺 SLAM 中,觀測主要是指相機成像的過程。

我們在現實生活中能看到大量的照片。在計算機中,一張照片由很多個畫素組成,每個畫素記錄了色彩或亮度的資訊。三維世界中的一個物體反射或發出的光線,穿過相機光心後,投影在相機的成像平面上。相機的感光器件接收到光線後,產生了測量值,就得到了畫素,形成了我們見到的照片。

5.1 相機模型

相機將三維世界中的座標點(單位為米)對映到二維影象平面(單位為畫素)的過程能夠用一個幾何模型進行描述。這個模型有很多種,其中最簡單的稱為針孔模型。針孔模型是很常用,而且有效的模型,它描述了一束光線通過針孔之後,在針孔背面投影成像的關係。在本書中我們用一個簡單的針孔相機模型來對這種對映關係進行建模。同時,由於相機鏡頭上的透鏡的存在,會使得光線投影到成像平面的過程中會產生畸變。因此,我們使用針孔和畸變兩個模型來描述整個投影過程。

在本節我們先給出相機的針孔模型,再對透鏡的畸變模型進行講解。這兩個模型能夠把外部的三維點投影到相機內部成像平面,構成了相機的內參數

5.1.1 針孔相機模型

在這裡插入圖片描述
現在來對這個簡單的針孔模型進行幾何建模。設 O − x − y − z 為相機座標系,習慣上我們讓 z 軸指向相機前方, x 向右, y 向下。 O 為攝像機的光心,也是針孔模型中的針孔。現實世界的空間點 P,經過小孔 O 投影之後,落在物理成像平面 O′ − x′ − y′ 上,成像點為 P ′。設 P 的座標為 [X,Y,Z]T[X, Y, Z]^T, P ′ 為 [X,Y,Z]T[X′, Y ′, Z′]^T,並且設物理成像平面到小孔的距離為 f(焦距)。那麼,根據三角形相似關係,有:
Zf=XX=YY. \frac{Z}{f} = −\frac{X}{X^′} = −\frac{Y}{Y^′}.


其中負號表示成的像是倒立的。為了簡化模型,我們把可以成像平面對稱到相機前方,和三維空間點一起放在攝像機座標系的同一側,如圖 5-2 中間的樣子所示。這樣做可以把公式中的負號去掉,使式子更加簡潔:
Zf=XX=YY. \frac{Z}{f} = \frac{X}{X^′} = \frac{Y}{Y^′}.
在這裡插入圖片描述
整理得:
X=fXZY=fYZ X^′ = f \frac{X}{Z} \\ Y^′ = f \frac{Y}{Z}
讀者可能要問,為什麼我們可以看似隨意地把成像平面挪到前方呢?這只是我們處理真實世界與相機投影的數學手段,並且,大多數相機輸出的影象並不是倒像——相機自身的軟體會幫你翻轉這張影象,所以你看到的一般是正著的像,也就是對稱的成像平面上的像。所以,儘管從物理原理來說,小孔成像應該是倒像,但由於我們對影象作了預處理,所以理解成在對稱平面上的像,並不會帶來什麼壞處。於是,在不引起歧義的情況下,我們也不加限制地稱後一種情況為針孔模型。

上式描述了點 P 和它的像之間的空間關係。不過,在相機中,我們最終獲得的是一個個的畫素,這需要在成像平面上對像進行取樣和量化。為了描述感測器將感受到的光線轉換成影象畫素的過程,我們設在物理成像平面上固定著一個畫素平面 o − u − v。我們在畫素平面得到了 P′ 的畫素座標[u,v]T[u, v]^T

畫素座標系通常的定義方式是:原點 o′ 位於影象的左上角, u 軸向右與 x 軸平行, v軸向下與 y 軸平行。畫素座標系與成像平面之間,相差了一個縮放和一個原點的平移。我們設畫素座標在 u 軸上縮放了 α 倍,在 v 上縮放了 β 倍。同時,原點平移了 [cx,cy]T[c_x, c_y]^T。那麼, P ′ 的座標與畫素座標 [u; v]T 的關係為:
{u=αX+cxv=βY+cy \left \{ \begin{aligned} u = αX′ + c_x \\ v = βY ′ + c_y \end{aligned} \right.
代入式(5.3)並把 αf 合併成 f_x,把 βf 合併成 f_y,得:
{u=fxXZ+cxv=fyYZ+cy \left \{ \begin{aligned} u = f_x \frac{X}{Z} + c_x \\ v = f_y \frac{Y}{Z} + c_y \end{aligned} \right.
其中, f 的單位為米, α, β 的單位為畫素每米,所以 fx,fyf_x, f_y 的單位為畫素。把該式寫成矩陣形式,會更加簡潔,不過左側需要用到齊次座標:
[uv1]=1Z[fx0cx0fycy001][XYZ]1ZKP. \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \frac{1}{Z} \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \triangleq \frac{1}{Z} KP.
我們按照傳統的習慣,把 Z 挪到左側:
Z[uv1]=[fx0cx0fycy001][XYZ]KP. Z \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \triangleq KP.
該式中,我們把中間的量組成的矩陣稱為相機的內參數矩陣(Camera Intrinsics) K。通常認為,相機的內參在出廠之後是固定的,不會在使用過程中發生變化。有的相機生產廠商會告訴你相機的內參,而有時需要你自己確定相機的內參,也就是所謂的標定。鑑於標定演算法業已成熟,且網路上能找到大量的標定教學,我們在此就不介紹了。

除了內參之外,自然還有相對的外參。考慮到在式(5.6)中,我們使用的是 P 在相機座標系下的座標。由於相機在運動,所以 P 的相機座標應該是它的世界座標(記為 PwP_w),根據相機的當前位姿,變換到相機座標系下的結果。相機的位姿由它的旋轉矩陣 R 和平移向量 t 來描述。那麼有:
ZPuv=Z[uv1]=K(RPw+t)=KTPw. ZP_{uv} = Z \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K (RP_w + t) = KT P_w.
注意後一個式子隱含了一次齊次座標到非齊次座標的轉換(你能看出來嗎?)。它描述了 PP 的世界座標到畫素座標的投影關係。其中,相機的位姿 R,tR, t 又稱為相機的外引數(Camera Extrinsics)。相比於不變的內參,外參會隨著相機運動發生改變,同時也是 SLAM中待估計的目標,代表著機器人的軌跡。

上式兩側都是齊次座標。因為齊次座標乘上非零常數後表達同樣的含義,所以可以簡單地把 Z 去掉:
Puv=KTPw.P_{uv} = KT P_w.
但這樣等號意義就變了,成為在齊次座標下相等的概念,相差了一個非零常數。為了避免麻煩,我們還是從傳統意義下來定義書寫等號。

我們還是提一下隱含著的齊次到非齊次的變換吧。可以看到,右側的 TPwT P_w 表示把一個世界座標系下的齊次座標,變換到相機座標系下。為了使它與 K 相乘,需要取它的前三維組成向量——因為 TPwT P_w 最後一維為 1。此時,對於這個三維向量,我們還可以按照齊次座標的方式,把最後一維進行歸一化處理,得到了 P 在相機歸一化平面上的投影:
P~c=[XYZ]=(TPw)(1:3),Pc=[X/ZY/Z1]. \tilde{P}_c = \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = (T P_w)_{(1:3)}, P_c = \begin{bmatrix} X/Z \\ Y/Z \\ 1 \end{bmatrix}.

相關推薦

視覺slamch5 joinMap.cpp 代碼註釋(筆記版)

iterator 實驗 article ons 如果 false 結果 插入 智能指針類 1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 #in

視覺SLAM》課後習題—ch7(更新中……)

一個 main slam 為什麽 技術分享 .com span point fde 參考:https://blog.csdn.net/zilanpotou182/article/details/66478915(SIFT、SURF、ORB三種特征點的區別) 1.除了本書

視覺SLAM》筆記(ch10)

bundle gin ont 學習 重建 16px 方程 進行 img ch 10—— 後端1 主要目標:1.理解後端的概念      2.理解以EFK為代表的濾波器後端工作原理      3.理解非線性優化得後端,明白稀疏性是如何利用的      4.使用g2

視覺SLAM(二)——SLAM 學習資料

(1) orb_slam 官網(網站最後有5篇論文,價值很高) http://webdiis.unizar.es/~raulmur/orbslam/ (2)半仙居士blog(可以都看,很經典) http://www.cnblogs.com/gaoxiang12/ (3) 賀一加 blog(m

視覺SLAM學習筆記——第二

2.1引子:小蘿蔔的例子   1. 慣性測量單元(Inertial Measurement Unit, IMU)   2. 按照工作方式的不同,相機可以分為單目相機(Monocular)、雙目相機(Stereo)、和深度相機(RGB-D)三大類。   3. RGB-D除了能夠採集到彩色圖片之外,還能夠讀

視覺SLAM學習筆記——第三講--三維空間剛體運動

3.1 旋轉矩陣   3.1.1 點和向量,座標系   內積可以描述向量之間的投影關係。   外積的方向垂直於這兩個向量,是兩個向量張成的四邊形的有向面積。還能用外積表示向量的旋轉。   3.1.2 座標系間的歐式變換   旋轉矩陣是行列式為1的正交矩陣。旋轉矩陣可以描述相機的旋轉。SO(n)是特殊

視覺SLAM學習筆記——第--李群與李代數

4.1李群與李代數基礎   旋轉矩陣和變換矩陣對加法是不封閉的。換句話說,對於任意兩個旋轉矩陣R1, R2,按照矩陣加法的定義,和不再是一個旋轉矩陣。   SO(3) 和 SE(3)對乘法是封閉的。兩個旋轉矩陣相乘,表示做了兩次旋轉。對於這種只有一個運算的集合,我們稱之為群。   4.1.1 群   

視覺SLAM學習筆記——第五講--相機與影象

5.1 相機模型   5.1.1 針孔相機模型   畫素座標系與成像平面之間,相差了一個縮放和一個原點的平移。   內參數矩陣(Camera Intrinsics)K   標定:自己確定內參。   5.1.2 畸變   由透鏡形狀引起的畸變稱為徑向畸變。   桶形畸變是由於影象放大率隨著與光軸之

視覺SLAM學習筆記——第六--非線性優化

6.1 狀態估計問題   6.1.1 最大後驗與最大似然   貝葉斯法則   似然是指"在現在的位姿下,可能產生怎樣的觀測資料"。   最大似然估計“在什麼樣的狀態下,最可能產生現在觀測到的資料”。   6.1.2 最小二乘的引出 6.2 非線性最小二乘   6.2.1 一階和二階梯度法   

視覺SLAM精品總結》12 迴環檢測建立字典

  這部分並不難,主要用到了一個詞袋模型(BoW),對兩幅影象的特徵點進行匹配。 建立字典:一個單詞是某一類特徵的集合,字典生成是個聚類問題,可使用K-meams演算法。 匹配相似性:暴力計算量太大,可用二分查詢提升效率,以及k叉樹表達字典(層次聚類) 目錄:

視覺slam》之第3-三維剛體運動

  第三講:三維空間剛體運動 旋轉的幾種表達方式 向量 關於向量: 注:其中e1,e2,e3為線性空間下的一組基。 向量的內積: 注:向量的內積表示向量間的投影關係。 向量的外積 注:可以使用外積表示向量的旋轉。 注:^ 記成一個反對稱符

視覺SLAM(三)——A星演算法詳解

點開全文 點開全文 點開全文 A* 尋路演算法 原文地址: http://www.gamedev.net/reference/articles/art

SLAM學習小組 : 視覺SLAM 第三講 + 視覺SLAM理論與實踐 第二節

一、熟悉Eigen矩陣運算 Wiki Eigen 設線性⽅程 Ax = b,在 A 為⽅陣的前提下,請回答以下問題: 1. 在什麼條件下,x 有解且唯⼀? 線性方程組的矩陣滿秩(非奇異矩陣) 2. 高斯消元法的原理是什麼? 高斯消元法是將方程組中的一方程的未知數用含有另一

視覺SLAM》課後習題—ch6

7.請更改曲線擬合實驗中的曲線模型,並用Ceres和g2o進行優化實驗。例如,可以使用更多的引數和更復雜的模型   Ceres:以使用更多的引數為例:y-exp(ax^3+bx^2+cx+d)   僅僅是在程式中將模型引數增加到4維,沒什麼創新而言    1 #include <iost

視覺SLAM講課後習題—ch8 《視覺SLAM》筆記(ch8)

1.除了LK光流之外,還有哪些光流方法?它們各有什麼特點?   參考:https://blog.csdn.net/on2way/article/details/48953975 1)LK(Lucas-Kanada)光流: 一種經典的方法,基於區域性特徵計算光流2)Horn-Schunck光流方法:全域性性

SLAM學習--視覺SLAM第三方庫安裝

echo "安裝eigen3" sudo apt-get --yes --force-yes install libeigen3-dev cd ~/ThirtyLib echo "安裝Sopus" g

視覺slamch5 joinMap.cpp 程式碼註釋(筆記版)

1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 #include <opencv2/core/core.hpp> 5 #include

視覺 SLAM

第 5 講 相機與影象 本節目標 1. 理解針孔相機的模型、內參與徑向畸變引數。 2. 理解一個空間點是如何投影到相機成像平面的。 3. 掌握 OpenCV 的影象儲存與表達方式。 4. 學會基本的攝像頭標定方法。 本講,我們要討論“機器人如何觀測外部世界”,

視覺SLAM-第九例程執行出錯

編譯通過,執行時,有時會一閃如書中所示的3d顯示的介面,隨即終止,出現如下錯誤: [email protected]:~/0.2$bin/run_vo config/default.yaml dataset:/home/caiming/fr1_xyz read

視覺SLAM》學習筆記-第部分習題的證明思路

1 驗證SO(3)、SE(3) 和Sim(3) 關於乘法成群 證明: 先看SO(3). 定義為: SO(3)={R∈R3×3|RR⊤=I,det(R)=1}SO(3)={R∈R3×3|RR⊤=I,det(R)=1} 假設R1,R2∈SO(3)R1,