計(jì)算機(jī)視覺 3D 重建—側(cè)重?zé)o人駕駛
最近沉浸了一段時(shí)間,沉浸不等于放棄,而是一種醞釀的過程。那么接下來我們就來分享一下這一段時(shí)間自己整理的干貨。跟著我,相信會(huì)有所得,也希望自己也辛苦沒有白費(fèi)。代理如何從理論到實(shí)踐來實(shí)現(xiàn)一個(gè)無人駕駛系統(tǒng)。這里說一下,分享內(nèi)容會(huì)由淺入深,會(huì)做得足夠細(xì)致,這樣一來開始你可能會(huì)感覺有些枯燥,甚至乏味。不過只要大家耐著性子看下去,相信會(huì)有所搜索。
對(duì)讀者的一點(diǎn)要求
這里妄自稱你們讀者,其實(shí)各位都是我的朋友和老師。這次分享雖然足夠簡(jiǎn)單、足夠細(xì)致,但是還是會(huì)有一定門檻的。需要具有基礎(chǔ)的高等數(shù)學(xué)和線性代數(shù)方面的知識(shí),只要這樣你才能夠理解文章出現(xiàn)的公式和概念。但不必過于擔(dān)心,只是基礎(chǔ),無需深入,也就是不能再基礎(chǔ)的概念有所了解。
對(duì)自己的一點(diǎn)要求
這一次對(duì)自己也提了一點(diǎn)要求,不能只顧自己 high。自己除了繼續(xù)專注內(nèi)容,也會(huì)花一些心思在文章設(shè)計(jì)上,如何讓自己文字讀起來有趣同時(shí),如何讓邏輯上是環(huán)環(huán)相扣以便于大家閱讀,如何將晦澀抽象內(nèi)容說的淺顯易懂。這些都是自己在隨后文章逐漸改善和加強(qiáng)的方面。
會(huì)談到哪些技術(shù)
我們主要專注于兩個(gè)技術(shù),分別是計(jì)算機(jī)視覺技術(shù)和 SLAM 技術(shù),無論是深度學(xué)習(xí)在計(jì)算機(jī)視覺領(lǐng)域的應(yīng)用還是 SLAM 技術(shù)其實(shí)都是基于計(jì)算機(jī)視覺,所以個(gè)人覺得很有必要先普及一下計(jì)算機(jī)視覺基礎(chǔ)知識(shí)。
3 維重建是自己相對(duì)于來說比較感興趣的方向,所謂 3 維重建,就是基于單張圖像或者多張圖像來將 3D 環(huán)境重新構(gòu)建出來。這部分內(nèi)容雖然有趣,但是要想掌握這部分內(nèi)容其實(shí)并非易事,因?yàn)檫@部分內(nèi)容會(huì)涉及到許多領(lǐng)域的知識(shí)。這是一次從 3D 世界到 2D 世界的轉(zhuǎn)換,或者說是映射。在轉(zhuǎn)換過程中深度信息將會(huì)丟失或者是換一種表達(dá)方式。完成這個(gè)映射的就是攝像機(jī)。
小孔攝像機(jī)
將膠片直接放置在物體前方是我們將 3 維世界直接映射到圖像上一種最簡(jiǎn)單,也是最直觀的做法,不過這樣做的問題也是顯而易見,膠片上每一個(gè)點(diǎn)都接受到環(huán)境中多個(gè)的物體發(fā)送出光線(信息)。所以最終在膠片上的圖像都是模糊的,很難記錄下真實(shí)世界中物體的信息。
那么如何在攝像機(jī)和膠片間放上一個(gè)隔板,隔板的中間開上小孔,這樣一來物體發(fā)射光線經(jīng)過小孔后就不會(huì)發(fā)散,通過帶有小孔的隔板就可以減少模糊,也就是物體上點(diǎn)與圖像上的點(diǎn)形成了一一對(duì)應(yīng)的關(guān)系,從而得到清晰的圖像。
這里會(huì)利用到三角形相似法則,紅色表示的成像平面就是像平面,那么像平面到小孔的距離為 f,f 也就是我們熟悉的焦距。這里小孔就是光圈,還就是我們通常研究的是和像平面關(guān)于小孔對(duì)稱的虛擬像平面。小孔到成像物體的距離用 z 來表示。
那么根據(jù)三角形相似法則就可以得到上面的公式,從上面公式不難看出當(dāng)相機(jī)(小孔)和物體之間距離 z 固定情況,調(diào)整焦距 f 也就是成像平面到小孔之間的距離,可以調(diào)整成像的大小。相機(jī)坐標(biāo)系是在光心處建立的 3 維坐標(biāo)系,而在像平面上建立的是坐標(biāo)系 2 維坐標(biāo)系。這里 p 點(diǎn)為相機(jī)坐標(biāo)系中的點(diǎn),x、y 和 z 表示 p 點(diǎn)的坐標(biāo),而 p prime 表示 p 點(diǎn)在成像平面中的對(duì)應(yīng)地點(diǎn),x 和 y prime 分別表示該點(diǎn)在成像平面的坐標(biāo)。
我們從一個(gè)軸 y 來考慮一下成像平面 y prime 攝像機(jī)坐標(biāo)系中 y 的對(duì)應(yīng)關(guān)系。
通過這個(gè)關(guān)系就可以將空間點(diǎn)映射到像平面上的坐標(biāo)。
通過上面的圖,我們可以看出調(diào)整光圈的大小對(duì)成像的影響。上面圖下標(biāo)數(shù)值表示是在該大小光圈下拍攝的圖像,我們可能會(huì)發(fā)現(xiàn)在 2mm 光圈成像是無法清晰成像的,而在 0.35mm 就可以清楚地看出字母 LUZ。光圈越小圖像就越清晰,而調(diào)整光圈變大后圖像就變得模糊,這是因?yàn)檎{(diào)整光圈變大后膠片上一個(gè)點(diǎn)就對(duì)應(yīng)真實(shí)世界的多個(gè)點(diǎn),所以造成模糊的效果。當(dāng)縮小光圈時(shí),到達(dá)膠片上的光線就變少了,所以調(diào)小光圈后圖像就會(huì)變暗。
為了解決這個(gè)光線到達(dá)成像平面變少問題,才引入了透鏡。
不過小孔成像的缺點(diǎn)就是,因?yàn)楣饩€不足所以最終造成了成像平面會(huì)比較暗。通過引入透鏡后成像物體的多條光線通過透鏡后會(huì)聚集到成像平面上一點(diǎn),這樣也就解決了成像物體光線不足的問題。凸透鏡兩個(gè)特性是所有平行于光軸的光線都會(huì)會(huì)聚到焦點(diǎn),焦點(diǎn)到透鏡中心點(diǎn)的距離稱為焦距。穿過透鏡中心的光線的方向是不會(huì)發(fā)生改變的。透鏡焦距是跟透鏡球面半徑 R 和透鏡折射系數(shù) n 有關(guān)系的,公式如下:
那么從透鏡到成像平面距離為 b 這里隨后就只會(huì)考慮。 b 而不會(huì)再去考慮 f 和 z_0 。雖然透鏡解決了光線不足的問題,但是透鏡成像并非完美,還存在同樣透鏡成像并非完美,通常也存在問題,接下來就會(huì)提及失焦和徑向畸變的問題。
失焦
在第一圖像中,成像平面放在焦點(diǎn)處可以得到一個(gè)清晰的小光斑,可以看到清晰成像物體,在第二張和第三張圖像中成像片面分別位于焦點(diǎn)前方或者后方都會(huì)得到一個(gè)模糊的圖像,這就是失焦的現(xiàn)象。
徑向畸變
透鏡的第二個(gè)問題就是徑向畸變,圖像像素點(diǎn)以畸變中心為中心點(diǎn),沿著徑向產(chǎn)生的位置偏差,從而導(dǎo)致圖像所成的像發(fā)生形變。
這里分別列出枕形畸變(pincushion distortion)和桶形畸變(barrel distortion)。枕形畸變:又稱鞍形形變,視野中邊緣區(qū)域的放大率遠(yuǎn)大于光軸中心區(qū)域的放大率,常用在遠(yuǎn)攝鏡頭中(上圖中)。桶形畸變,與枕形畸變相反,視野中光軸中心區(qū)域的放大率遠(yuǎn)大于邊緣區(qū)域的放大率,常出現(xiàn)在廣角鏡頭和魚眼鏡頭中(上圖右)。
像平面到像素平面
攝像機(jī)幾何中,如何將像素平面上的點(diǎn)對(duì)應(yīng)到攝像機(jī)坐標(biāo)上,有兩點(diǎn)需要注意,第一點(diǎn)是像素到米之間單位轉(zhuǎn)換,相機(jī)坐標(biāo)系通常是以米為單位,而在圖像平面內(nèi)是以像素為單位。第二點(diǎn)坐標(biāo)點(diǎn)的位置,通常在圖像中。
偏置
通常在圖像平面我們喜歡以圖像左上角作為原點(diǎn),而在攝像機(jī)坐標(biāo)系是以攝像頭中心點(diǎn)為原點(diǎn),這樣攝像機(jī)坐標(biāo)中心和圖像的中心之間就存在偏差用和
來表示偏差,在攝像機(jī)的點(diǎn) (x, y, z) 。
單位變換
這里 k 和 l 表示一米有多少個(gè)像素,這兩個(gè)參數(shù)是攝像機(jī)感光元件所決定的。因?yàn)橄袼乜赡懿皇欠叫蔚模?k 和 l 值可能不相等。
可以用 alpha 或者 beta 來表示 fk 和 fl 一來可以簡(jiǎn)化公式的表達(dá)為如下公式:
(u,v) 與 z 不是一個(gè)常數(shù),而是一個(gè)變量 u,v 與 x, y 不是線性關(guān)系,因?yàn)檫@里還有一個(gè) z 是變量,那么我們就希望找到 u,v 到 x,y 線性變換,這里介紹一下齊次坐標(biāo)的概念。