SLAM基礎(chǔ):相機(jī)與圖像
點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)
來自 | 知乎? ?
鏈接丨h(huán)ttps://zhuanlan.zhihu.com/p/33583981
本文僅作學(xué)術(shù)交流,如有侵權(quán),請(qǐng)聯(lián)系后臺(tái)刪除。
相機(jī)拍照,是將三維世界中的一個(gè)三維點(diǎn)映射到對(duì)應(yīng)的二維影像平面的過程。這個(gè)過程能夠用一個(gè)幾何模型來進(jìn)行描述。在各種各樣的模型中,最簡(jiǎn)單也最常用的就是針孔相機(jī)模型,也叫針孔模型。這個(gè)模型較為簡(jiǎn)單,而由于相機(jī)鏡頭上透鏡的存在,成像的過程中會(huì)有畸變產(chǎn)生。為此,需要另外對(duì)畸變進(jìn)行建模。
?
初中物理里都會(huì)有一個(gè)小孔成像的實(shí)驗(yàn),這個(gè)小孔成像的模型可以看作是針孔相機(jī)模型的基礎(chǔ)。

如上圖所示,相機(jī)坐標(biāo)系為O-x-y-z,想象人站在相機(jī)后面,O 為相機(jī)光心,z軸指向相機(jī)前方,x 軸向右而y 軸向下。真實(shí)世界中的一個(gè)點(diǎn)P,經(jīng)過小孔O 投影后,落在物理成像平面O'-x'-y' (也稱像平面坐標(biāo)系)上,稱為像點(diǎn)P'。
假設(shè)P在相機(jī)坐標(biāo)系下的坐標(biāo)為[X, Y, Z]T,P' 為[X', Y', Z']T,焦距為f。根據(jù)相似三角形有:

其中,負(fù)號(hào)表示所成的像是倒立的。
習(xí)慣上把成像平面對(duì)稱到相機(jī)的前方,再整理一下上式即可得:

至此,我們描述了點(diǎn)P 和它的像之間的空間關(guān)系。在數(shù)碼相機(jī)中,我們最終得到的是由一個(gè)個(gè)像素組成的數(shù)字影像,這需要在成像平面上進(jìn)行采樣和量化。這里就不針對(duì)二者進(jìn)行介紹了。
在物理成像平面上定義一個(gè)像素坐標(biāo)系?o'-u-v。一樣地想象人站在相機(jī)之后,其原點(diǎn)o' 位于圖像的左上角,u軸向右和x 軸平行,v 軸向下和y 軸平行。假設(shè)P' 的像素坐標(biāo)為[u, v]T。像素坐標(biāo)系和物理成像平面O'-x'-y' 之間相差縮放和平移。因此,假設(shè)像素坐標(biāo)在u軸上縮放了 倍,在v 軸上縮放 倍。同事,二者之間的平移量為[cx, cy]T。那么,P' 在物理成像平面下的坐標(biāo)和其像素坐標(biāo)間的關(guān)系為:

將式(2) 代入并把?
?合并成?
?,把?
?合并成?
(這也是x 軸上的焦距和y 軸上的焦距不同的原因),可得:

上式就是相機(jī)坐標(biāo)系下,一個(gè)空間點(diǎn)的三維坐標(biāo)到其對(duì)應(yīng)像點(diǎn)到像素坐標(biāo)到轉(zhuǎn)換關(guān)系。其中,f 的單位為米,?
?的單位為像素/米。
利用齊次坐標(biāo),將上市寫成矩陣形式可得:

上式中,K?稱為相機(jī)矩陣或者內(nèi)參數(shù)矩陣,因?yàn)樗亩际窍鄼C(jī)的參數(shù)。一般習(xí)慣把Z 放在左側(cè),計(jì)算完后再對(duì)結(jié)果除以其第三個(gè)值以得到像素坐標(biāo)。通常認(rèn)為相機(jī)矩陣在出廠之后是固定的并由廠家給出。如果沒有則可以對(duì)相機(jī)進(jìn)行標(biāo)定以得到相機(jī)內(nèi)參。
注意一直到這里,我們都沒有涉及到相機(jī)的位姿T,因?yàn)槲覀円恢痹谙鄼C(jī)坐標(biāo)系下。相機(jī)的位姿描述了相機(jī)在世界坐標(biāo)系下的位置和姿態(tài),也給出了世界坐標(biāo)系到相機(jī)坐標(biāo)系的變換關(guān)系。舉例來說,對(duì)于一組照片,如果取第一張照片對(duì)應(yīng)的相機(jī)坐標(biāo)系為世界坐標(biāo)系,則對(duì)應(yīng)的相機(jī)位姿為旋轉(zhuǎn)矩陣為單位陣而平移向量為0。而其他照片對(duì)應(yīng)的相機(jī)位姿為該世界坐標(biāo)系下到該照片對(duì)應(yīng)的相機(jī)坐標(biāo)系的變換關(guān)系。
由于相機(jī)在運(yùn)動(dòng),所以點(diǎn)P 的相機(jī)坐標(biāo)應(yīng)該是它的世界坐標(biāo),記作Pw,根據(jù)相機(jī)當(dāng)前的位姿變換到相機(jī)坐標(biāo)系下的結(jié)果。

上式使用了齊次坐標(biāo)并且包含了一次齊次坐標(biāo)到非齊次坐標(biāo)的變換。其中,R,t?或著T?表示相機(jī)的外參數(shù),它會(huì)隨著相機(jī)的運(yùn)動(dòng)而發(fā)生改變,是SLAM 過程中待估計(jì)的目標(biāo),表示著機(jī)器人的軌跡。最后,上式的T?為Tcw,表示世界坐標(biāo)系到相機(jī)坐標(biāo)系的變換,其轉(zhuǎn)置為Twc。
注意到齊次坐標(biāo)乘上一個(gè)非零常數(shù)后表示的是同一個(gè)點(diǎn),所以可以把上市左側(cè)中的Z 去掉。

前面我們提到這個(gè)式子包含一次齊次坐標(biāo)到非齊次坐標(biāo)的變換。因?yàn)橛覀?cè)的TPw?是一個(gè)4維向量。將之除以最后一維并取前三維得到相機(jī)坐標(biāo)系下的三維坐標(biāo)。對(duì)于這個(gè)三維向量,按照齊次坐標(biāo)的方式,可以再對(duì)其最后一維進(jìn)行歸一化處理,就得到了P 在相機(jī)歸一化平面?上的投影:

此時(shí),Pc?可以看成是一個(gè)二維的齊次坐標(biāo),稱為歸一化坐標(biāo)。它可以看成是位于相機(jī)前方z = 1 處的平面上,該平面稱為歸一化平面。Pc 經(jīng)過相機(jī)內(nèi)參后就得到了像素坐標(biāo),所以可以把像素坐標(biāo)[u, v]T 看成是歸一化平面上的點(diǎn)進(jìn)行量化測(cè)量的結(jié)果。

這一小節(jié)我們介紹了相機(jī)模型和各個(gè)坐標(biāo)系的轉(zhuǎn)換關(guān)系。其中涉及了世界坐標(biāo)系,相機(jī)坐標(biāo)系,歸一化坐標(biāo),像平面坐標(biāo)系和像素坐標(biāo)系。要注意它們之間的區(qū)別和兩兩之間的轉(zhuǎn)換關(guān)系。
畸變
為了獲得好的成像效果,一般會(huì)在相機(jī)前方加上各種透鏡。這就會(huì)對(duì)光線的傳播產(chǎn)生新的影響:
透鏡自身對(duì)光線傳播的影響;
由于機(jī)械組裝中的誤差,導(dǎo)致透鏡和稱像平面不完全平行而產(chǎn)生的誤差。
第一種原因引起的畸變稱為徑向畸變。因?yàn)樵趯?shí)際的加工過程中,透鏡一般是中心對(duì)稱的,這就使得這種畸變通常也是徑向?qū)ΨQ。它主要分為兩大類:桶形畸變和枕形畸變。

可以看大,桶形畸變是由圖像的放大率隨著光軸之間的距離增加而減小;枕形畸變則相反。它們是徑向畸變,因此穿過圖像中心和光軸有交點(diǎn)的直線能保持形狀不變。
而第二種原因引入的畸變稱為切向畸變,并不存在對(duì)稱性質(zhì)。
前面說過,假設(shè)某一點(diǎn)P的歸一化表示為[x, y]T。也可以用極坐標(biāo)來表示它,寫作?
?. 徑向畸變可以看作是坐標(biāo)點(diǎn)沿著長(zhǎng)度方向發(fā)生了變化?
?,也就是其距離原點(diǎn)的長(zhǎng)度發(fā)生了變化;切向畸變可以看成是坐標(biāo)點(diǎn)沿著切線方向發(fā)生了變化,也就是水平夾角變化了?
?。
對(duì)于徑向畸變,由于它們都是隨著與中心之間的距離增加而增加,因此可以用一個(gè)多項(xiàng)式函數(shù)來描述畸變前后的坐標(biāo)變化:

在上式中,對(duì)于畸變較小的圖像中心區(qū)域,畸變糾正主要是k1 起作用;對(duì)于畸變較大的邊緣區(qū)域,主要是k2 起作用。根據(jù)所用鏡頭,可以適當(dāng)使用合適的校正系數(shù)。
對(duì)于切向畸變,可以使用另外的兩個(gè)參數(shù)p1, p2 來進(jìn)行糾正:

聯(lián)合上面兩個(gè)式子,對(duì)于相機(jī)坐標(biāo)系中的一點(diǎn)P [X, Y, Z],找到其對(duì)應(yīng)像點(diǎn)的像素坐標(biāo)的過程可以描述為:
將三維空間點(diǎn)投影到歸一化圖像平面。設(shè)它的歸一化坐標(biāo)為[x, y]T;
進(jìn)行畸變矯正:

通過相機(jī)的內(nèi)參數(shù),利用糾正后的點(diǎn)求的該點(diǎn)的像素坐標(biāo):

?
針孔相機(jī)模型描述了單個(gè)相機(jī)的成像過程。但僅有一張相片是不足以確定對(duì)應(yīng)空間點(diǎn)的具體位置的。考慮相機(jī)光心O 和像點(diǎn)p,二者的連線在物方空間是一條射線,這條射線上的所有點(diǎn)都可能投影到這個(gè)像點(diǎn)上。只有當(dāng)P的深度確定時(shí),才能確定它的空間位置。
確定深度的方法有很多種,人眼就是一個(gè)典型的雙目相機(jī)模型:通過左右眼看到的景物的差異(稱為視差)來判斷物體與我們之間的距離。利用雙目相機(jī),同時(shí)采集左右相機(jī)的圖像,計(jì)算圖像間的時(shí)差,以此估計(jì)每一個(gè)像素的深度。

雙目相機(jī)一般由左右兩個(gè)相機(jī)組成,可以把兩者都看作是針孔相機(jī)。左右相機(jī)間的距離稱為基線(一般二者嚴(yán)格平行,距離固定)。
考慮一個(gè)空間點(diǎn)P,它在左右相機(jī)上的像點(diǎn)分別為Pl, Pr。在理想情況下,這兩個(gè)像的位置的差異只出現(xiàn)在x 軸上(因?yàn)樽笥蚁鄼C(jī)嚴(yán)格平行,只在x 軸上有差異)。記左右像點(diǎn)的x 軸上的像素坐標(biāo)分別為uL, uR。根據(jù)下圖所示的相似三角形有:


設(shè)?
?為左右像點(diǎn)的橫坐標(biāo)之差,即視差。根據(jù)上市則有:

可以看到,視差與距離成反比。時(shí)差越大,距離越近。此外,基線d 確定了雙目相機(jī)能確定的深度的最大值。基線越長(zhǎng),能測(cè)得的距離就越遠(yuǎn)。
RGB-D 相機(jī)模型
RGB-D 相機(jī)可以主動(dòng)測(cè)量每個(gè)像素的深度。目前的RGB-D 相機(jī)按原理可以分為兩大類:
通過紅外結(jié)構(gòu)光?來測(cè)量像素深度,如Kinect 1;
通過飛行時(shí)間?(time-of-flight) 來測(cè)量像素深度,如Kinect 2.
測(cè)量了深度后,RGB-D 相機(jī)通常按照(生產(chǎn)時(shí)就確定好的)相機(jī)擺放位置,自動(dòng)完成深度圖和彩色圖之間的配對(duì)工作,輸出一一對(duì)應(yīng)的彩色圖和深度圖。如此,我們就可以在兩張影像上的同一個(gè)像素位置讀取到色彩信息和深度信息,計(jì)算像素的三維坐標(biāo)。
圖像
在計(jì)算機(jī)中,圖像是一個(gè)二維數(shù)組/ 矩陣。以最簡(jiǎn)單的灰度圖為例,每個(gè)像素位置(x, y) 對(duì)應(yīng)一個(gè)灰度值I。則一個(gè)寬為w 高為h 的圖像可以表示為:

由于存儲(chǔ)空間和數(shù)值精度的限制,我們無法表達(dá)出所有色彩。常用0 - 255 的整數(shù)(即一個(gè)字節(jié))來表達(dá)圖像的灰度強(qiáng)度。則一張寬640 高480?像素分辨率的灰度圖就表示為:
unsigned char image[480][640]
注意到高度為圖像的行數(shù)而寬度則為列數(shù)。而計(jì)算機(jī)中第一個(gè)下標(biāo)為數(shù)組的行,第二個(gè)下標(biāo)為數(shù)組的列。表示為:

注意到這里y 軸是行而x 軸是列。所以如果我們想訪問像素坐標(biāo)為 (x, y) 的像素,則應(yīng)寫為:
unsigned char pixel = image[y][x]
請(qǐng)讀者注意這里x 和y 的順序。這是很多程序錯(cuò)誤的原因。
彩色圖像由于在一個(gè)位置上同時(shí)有RGB 分別對(duì)應(yīng)的像素強(qiáng)度,所以引入了通道?(channel) 的概念。對(duì)于每一個(gè)像素,用三個(gè)通道分別保留其R、G、B 上的像素值。和灰度圖一樣,每個(gè)通道一般也是一個(gè)字節(jié)(8位),彩色圖的一個(gè)像素需要24 位存儲(chǔ)空間。
對(duì)于RGB-D 相機(jī)產(chǎn)生的深度圖,距離單位一般為毫米,8 位存儲(chǔ)空間只能表示0.255 米,顯然是不夠的。一般采用16位整數(shù)來記錄深度圖的信息。16位整數(shù)能表示0 - 65535 之間的數(shù)值,最大值大概為65米。從這里我們也可以看出,RGB-D 相機(jī)不能表示大范圍的距離信息。
本文僅做學(xué)術(shù)分享,如有侵權(quán),請(qǐng)聯(lián)系刪文。
