親愛的同學們,我們的世界是3D世界,我們的雙眼能夠觀測三維資訊,幫助我們感知距離,導航避障,從而翱翔于天地之間,而當今世界是智能化的世界,我們的科學家們探索各種機器智能技術,讓機器能夠擁有人類的三維感知能力,并希望在速度和精度上超越人類,比如自動駕駛導航中的定位導航,無人機的自動避障,測量儀中的三維掃描等,都是高智機器智能技術在3D視覺上的具體實作,
立體視覺是三維重建領域的重要方向,它模擬人眼結構用雙相機模擬雙目,以透視投影、三角測量為基礎,通過邏輯復雜的同名點搜索演算法,恢復場景中的三維資訊,它的應用十分之廣泛,自動駕駛、導航避障、文物重建、人臉識別等諸多高科技應用都有它關鍵的身影,
本課程將帶大家由淺入深的了解立體視覺的理論與實踐知識,我們會從坐標系講到相機標定,從被動式立體講到主動式立體,甚至可能從深度恢復講到網格構建與處理,感興趣的同學們,來和我一起探索立體視覺的魅力吧!
本課程是電子資源,所以行文并不會有太多條條框框的約束,但會以邏輯清晰、淺顯易懂為目標,水平有限,若有不足之處,還請不吝賜教!
個人微信:EthanYs6,加我申請進技術交流群 StereoV3D,一起技術暢聊,
CSDN搜索 :Ethan Li 李迎松,查看網頁版課程,
隨課代碼,將上傳至github上,地址:StereoV3DCode:https://github.com/ethan-li-coding/StereoV3DCode
文章目錄
- 針孔模型Pinhole mode
- 坐標系簡介
- 影像坐標系
- 相機坐標系
- 內參矩陣
- 世界坐標系
- 外參矩陣
- 投影矩陣
- 總結
- 練習作業
針孔模型Pinhole mode
在科學研究中,一個現象內部的程序總是復雜而難以清晰看透,而聰明的學者們總會用最簡單的模型去做初始描述,提出一個相對簡單的模型,成像程序亦不例外,他們將三維世界中的坐標點映射到二維影像平面的程序用一個幾何模型進行描述,這個模型有很多種,其中最簡單的稱為針孔模型,
針孔成像的原理大家都學過,現實世界中源于某個物體的光線穿過針孔,會在底板上投影成一幅倒立的影像,如圖1所示:
將針孔模型對應到成像程序中,現實世界的物體即為三維空間的成像目標,針孔為攝像機中心,倒影成像平面則為二維影像平面,如圖二(左)所示,我們用簡單的線條來繪制這樣的關系,攝像機中心到成像平面之間的距離我們稱之為焦距 f f f,但是倒立的成像總感覺別扭,因此轉換一下,將成像平面拿到相機前方來,保持焦距為 f f f,由成像程序可知,影像此時不再是倒立的了,解放了大家的脖子,見圖2(右)所示,
|
|
從針孔模型中,我們可以找到一個特征,那就是現實世界的任一點、其在成像平面上的投影點、相機中心在一條直線上,這種特征稱為中心投影或者透視投影,也是做成像分析的基礎,透視投影將三維空間投影到二維平面上,是一種降秩空間透射變換(三維空間降成了二維空間),
坐標系簡介
通過針孔模型,我們了解了成像程序,似乎非常簡單,但它此時只是一張圖片,給你感官上的理解,要基于它完成復雜的3D測量,必須借用那一連串噼里啪啦讓人又愛又恨的數學公式,而公式建立的基礎,就是一個個坐標系,具體來說,是一個個笛卡爾坐標系,如果你不知道什么是笛卡爾坐標系,我想你也不會點開我的博客看到這里,所以介紹就此略過,
我認為你們已經掌握了一個前提知識:立體視覺的三個關鍵坐標系是影像坐標系、相機坐標系、世界坐標系,如果沒有,那我就強塞給你這個概念,
影像坐標系
影像坐標系是一個二維坐標系,是在影像內建立的坐標系,描述像素點在影像中的位置,分為以像素為單位的 ( u , v ) (u,v) (u,v)坐標系以及以物理尺寸為單位的 ( x , y ) (x,y) (x,y)坐標系,在計算機視覺中, ( u , v ) (u,v) (u,v)坐標系以左上角位置為原點, u u u軸和 v v v軸分別平行于影像平面的兩條垂直邊( u u u軸朝右, v v v軸朝下),如圖3左所示; ( x , y ) (x,y) (x,y)坐標系以像主點 ( u 0 , v 0 ) (u_0,v_0) (u0?,v0?)為原點, x x x軸和 y y y軸分別與 u u u軸和 v v v軸平行且方向一致,如圖3右所示,
|
|
上面提到像主點,特別說明一下,它是攝影中心到成像平面的垂點,它是一個非常重要的點位,
如果我們知道像素到物理尺寸的轉換關系,即一個像素的物理尺寸,也就是像元尺寸為
d
x
?
d
y
dx*dy
dx?dy(
x
x
x方向尺寸為
d
x
dx
dx,
y
y
y方向尺寸為
d
y
dy
dy),就可以在兩類坐標系之間相互轉換:

為了便于矩陣運算,我們會寫成矩陣形式:

公式兩邊的三維矢量是一種齊次表達方式,即把第三維設定為1來用三維矢量表示二維矢量,這樣做的好處是可以用矩陣運算的方式完成三維到二維的變換,為什么要做這個轉換呢?是因為
x
y
xy
xy坐標系和相機坐標系的緊密聯系,同學們往后看,
相機坐標系
相機坐標系是一個三維空間坐標系,是非常關鍵的一個坐標系,它承擔著建立影像坐標系和世界坐標系之間聯系的重任,所以前人們在建立相機坐標系時,有一個很關鍵的考量是如何能更好的把影像坐標系和世界坐標系之間聯系起來,
兩個三維坐標系(相機和世界)之間的轉換用旋轉和平移就可以方便表達,重點是三維的相機坐標系和二維的影像坐標系之間如何更好轉換,方案是這樣的:相機坐標系的原點在相機中心, X Y XY XY軸和影像 x y xy xy坐標系的 x y xy xy軸平行, Z Z Z軸垂直于像平面且朝向像平面, Z Z Z軸和像平面的交點正是影像 x y xy xy坐標系的原點(像主點),如圖4所示,
在此方案下,像平面上的所有像素點在相機坐標系下的 Z Z Z坐標等于焦距 f f f, X Y XY XY坐標和影像 x y xy xy坐標系下的值相等,即若像素點 p p p在影像 x y xy xy坐標系下的坐標為 ( x , y ) (x,y) (x,y),則其在相機坐標系下的坐標為 ( x , y , f ) (x,y,f) (x,y,f),
根據中心投影的特征,假設像素點 p p p是空間點 P P P的投影點,那么如何建立兩兄弟之間的坐標關系呢?
我們假設像素
p
p
p在相機坐標系下的坐標為
(
X
c
,
Y
c
,
Z
c
)
(X_c,Y_c,Z_c)
(Xc?,Yc?,Zc?)(下標c是camera的意思),若兩點位于從坐標系原點發出的同一條直線上,那么他們的坐標有什么關系?答案是等比例關系,即

為了便于矩陣運算,我們會寫成矩陣形式:

還記得上一節,我們把
x
y
xy
xy坐標系轉換成
u
v
uv
uv坐標系,結合上式,便可以把相機坐標系轉換成
u
v
uv
uv坐標系,即

通常把
Z
c
Z_c
Zc?稱為尺度因子
λ
λ
λ,把中間的3x3矩陣叫做內參矩陣
K
K
K,顯然內參矩陣
K
K
K描述的是相機坐標系到
u
v
uv
uv坐標系的轉換關系,簡單的運算式如下

內參矩陣
內參矩陣
K
K
K是相機的關鍵引數之一,
f
d
x
\frac f{d_x}
dx?f?和
f
d
y
\frac f{d_y}
dy?f?實際是將以物理尺寸為單位的焦距
f
f
f轉換成像素為單位的焦距值,記
f
x
=
f
d
x
f_x=\frac f{d_x}
fx?=dx?f?,
f
y
=
f
d
y
f_y=\frac f{d_y}
fy?=dy?f?,
f
x
f_x
fx?和
f
y
f_y
fy?分別是焦距在兩個像元方向上的像素單位值,最終得到內參的矩陣表達:

額外需要了解的一點是,由于制造工藝的偏差,像素不是絕對的矩形(圖6左),而是一個平行四邊形(圖6右),
|
|
這時候像素的縱向邊界和
y
y
y軸并不平行而是傾斜一定的角度,于是在
K
K
K矩陣中引入一個傾斜因子
s
s
s(實際上可以推導
s
=
f
x
t
a
n
(
a
)
s=f_xtan(a)
s=fx?tan(a),這里就不展開了,感興趣的可以查資料自己推導下),此時
K
K
K矩陣表示為

最后相機坐標到
u
v
uv
uv坐標的轉換公式為:

世界坐標系
世界坐標系是一個固定的三維坐標系,是一個絕對坐標系,它旨在將空間中的所有點都統一到同一個坐標系下表達,在不同的應用場景中,世界坐標系的定義并不一樣,比如大地測量中,將水準原點當做世界坐標系的原點;在相機標定中,將標定板的某個角點作為世界坐標系,

世界坐標系和相機坐標系都是三維坐標系,它們之間可以用旋轉平移來做轉換
假設空間點P在世界坐標系中的坐標為
(
X
w
,
Y
w
,
Z
w
)
(X_w,Y_w,Z_w)
(Xw?,Yw?,Zw?),則可以通過一個3x3的單位正交旋轉矩陣
R
R
R 和3x1的平移矢量
t
t
t 來轉換成相機坐標系坐標
(
X
c
,
Y
c
,
Z
c
)
(X_c,Y_c,Z_c)
(Xc?,Yc?,Zc?):

或者寫成另一種形式:

我們把旋轉矩陣
R
R
R 和平移矢量
t
t
t 稱為相機的外參矩陣,
外參矩陣
外參矩陣也是相機的關鍵引數之一,由一個3x3的單位正交旋轉矩陣 R R R 和3x1的平移矢量 t t t 組成,它們描述的是世界坐標系到相機坐標系之間的轉換關系,需要提一點的是,在不同學科中外參矩陣會有一些定義區別,比如在攝影測量學科中,將相機坐標系轉換到世界坐標系的旋轉矩陣 R R R 以及攝影中心在世界坐標系中的位置 C C C 作為外參,它們目的一致,都是為了描述相機和世界坐標系之間的轉換關系,
同樣用一個簡單運算式來描述世界坐標系到相機坐標系的變換:

投影矩陣
雖然我們花很多篇幅介紹了相機坐標系,但是在實踐程序中,最直接接觸的卻是影像 u v uv uv坐標系和世界坐標系,在影像三維重建中,通常前者是輸入,后者是輸出,所以將世界坐標系轉換成 u v uv uv坐標系是很關鍵的轉換,
上文已經得到了世界到相機,相機到
u
v
uv
uv的轉換公式,因此世界到
u
v
uv
uv并沒有什么難度:

世界坐標系到影像坐標系的轉換實際上表達的是透視投影中空間點到像點的投影關系,所以把該轉換矩陣叫做投影矩陣
M
M
M,通過矩陣運算可知投影矩陣是一個3x4的矩陣,它是內參矩陣和外參矩陣的乘積,
同樣用一個簡單運算式來表達這種轉換:

總結
本節我們通過針孔模型引入以透視投影為基本原理的相機成像模型,并對一切公式推導的源頭:三大坐標系(影像/相機/世界) 做了詳細的介紹,在深入了解坐標系的程序中,幾類關鍵的相機引數(內參/外參)也緩緩而出,用圖示加公式推導,讓大家直觀且有邏輯性的掌握這方面的知識,希望能夠給入門的同學一些幫助,下一節我們再見,
練習作業
這里為大家準備了一些練習題,可以通過實踐加深理解:
練習:寫一個Camera類(基于Eigen庫 ),用內參矩陣K、旋轉矩陣R、平移矩陣t(或相機中心C)來構造
實作介面:
- 世界坐標系到相機坐標系的轉換 W2C
- 相機坐標系到世界坐標系的轉換 C2W
- 相機坐標系到影像坐標系的轉換 C2I
- 世界坐標系到影像坐標系的轉換 W2I
- 有深度作為引數,影像坐標系到相機坐標系的轉換I2C
- 有深度作為引數,影像坐標系到世界坐標系的轉換I2W
參考答案地址:https://github.com/ethan-li-coding/StereoV3DCode
CSDN認證博客專家
立體視覺
工學博士
博客專家
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255902.html
標籤:其他
上一篇:[Python影像處理] 三十六.OpenCV影像幾何變換萬字詳解(平移縮放旋轉、鏡像仿射透視)
下一篇:C語言編程>第二十二周 ⑦ 下列給定程式中函式fun的功能是:從低位開始取出長整型變數a中奇數位上的數,依次構成一個新數放在b中。
