來(lái)源 | 汽車(chē)ECU開(kāi)發(fā)
如今,自動(dòng)駕駛的立體視覺(jué)變得越來(lái)越流行。計(jì)算機(jī)視覺(jué)領(lǐng)域在過(guò)去十年中發(fā)展迅猛,尤其是基于深度學(xué)習(xí)的障礙物檢測(cè)和計(jì)算機(jī)視覺(jué)領(lǐng)域。
YOLO 或 RetinaNet 等障礙物檢測(cè)算法提供 2D 邊界框,使用邊界框給出圖像中障礙物的位置。今天,大多數(shù)物體檢測(cè)算法都是基于單目RGB相機(jī),無(wú)法返回每個(gè)障礙物的距離。
為了返回每個(gè)障礙物的距離,工程師們將相機(jī)與激光雷達(dá)(光探測(cè)和測(cè)距)傳感器融合,利用激光返回深度信息和傳感器融合技術(shù)融合計(jì)算機(jī)視覺(jué)和激光雷達(dá)的輸出。
這種方法的問(wèn)題是使用了昂貴的激光雷達(dá)。工程師巧妙地利用對(duì)齊兩個(gè)攝像頭并使用幾何形狀來(lái)定義每個(gè)障礙物的距離:我們稱(chēng)之為偽激光雷達(dá)。
偽激光雷達(dá)利用幾何圖形來(lái)構(gòu)建深度地圖,并將其與目標(biāo)檢測(cè)相結(jié)合,以獲得三維距離。
實(shí)現(xiàn)深度估計(jì)的五個(gè)步驟:
通過(guò)兩個(gè)攝像頭,我們可以獲得物體的距離。這是三角測(cè)量的原理,也是立體視覺(jué)背后的核心幾何。下面是它的工作原理:
1、立體校準(zhǔn)-檢索相機(jī)的關(guān)鍵參數(shù);
2、對(duì)極幾何-定義我們?cè)O(shè)置的三維幾何;
5、障礙物距離估計(jì)- 在 3D 中查找對(duì)象,并與深度圖匹配。
在本文中,我們將學(xué)習(xí)如何執(zhí)行這 5 個(gè)步驟來(lái)構(gòu)建 3D 對(duì)象檢測(cè)算法,目標(biāo)是對(duì)于每個(gè)對(duì)象,我們可以估計(jì) X、Y、Z 位置。
01.立體校準(zhǔn)—內(nèi)部和外部校準(zhǔn)
當(dāng)你在網(wǎng)上看任何圖片時(shí),很可能相機(jī)已經(jīng)被校準(zhǔn)過(guò)了。每個(gè)相機(jī)都需要校準(zhǔn)。校準(zhǔn)是指將具有[X,Y,Z]坐標(biāo)的3D點(diǎn)轉(zhuǎn)換為具有[X,Y]坐標(biāo)的2D像素。
這一步的輸出很簡(jiǎn)單:我們需要相機(jī)的內(nèi)在參數(shù)和外在參數(shù)。這些將在稍后用于檢索距離。
圖像是如何產(chǎn)生的?
當(dāng)前相機(jī)使用針孔成像原理,用一個(gè)針孔讓少量的光線穿過(guò)相機(jī),從而獲得清晰的圖像。
相機(jī)還可以使用鏡頭來(lái)變焦,獲得更好的清晰度。如你所見(jiàn),鏡頭位于距離傳感器f的位置。這個(gè)距離f稱(chēng)為焦距。
前面提到相機(jī)校準(zhǔn)的目標(biāo)是找到合適的內(nèi)部和外部參數(shù)。我還說(shuō)過(guò),校準(zhǔn)的目的是幫助我們?nèi)∫粋€(gè)3D Point,并將其轉(zhuǎn)換為Pixel,從而創(chuàng)建一個(gè)圖像。
因此,以下是相機(jī)校準(zhǔn)在一張圖像中的工作方式:
外部校準(zhǔn)是從世界坐標(biāo)到相機(jī)坐標(biāo)的轉(zhuǎn)換。我們通常說(shuō)“這是一個(gè)特定坐標(biāo)系中的 3D 點(diǎn)。如果我們從相機(jī)框架看,這個(gè)點(diǎn)的坐標(biāo)是什么?”。世界中的一個(gè)點(diǎn)被旋轉(zhuǎn)到相機(jī)框架,然后轉(zhuǎn)換到相機(jī)位置。外部參數(shù)稱(chēng)為 R(旋轉(zhuǎn)矩陣)和 T(平移矩陣)。
內(nèi)部校準(zhǔn)
內(nèi)部校準(zhǔn)是從相機(jī)坐標(biāo)到像素坐標(biāo)的轉(zhuǎn)換。一旦我們有了 3D 點(diǎn),我們就會(huì)使用內(nèi)在參數(shù)將這個(gè) 3D 點(diǎn)轉(zhuǎn)換為像素,內(nèi)在參數(shù)是我們稱(chēng)為 K 的矩陣。
這是世界坐標(biāo)到圖像轉(zhuǎn)換的公式:
K為本征矩陣。它由f,焦距和(u,v)光學(xué)中心組成:這些都是內(nèi)在參數(shù)。
最終公式:
所以,我們現(xiàn)在知道,給定世界上的一個(gè)點(diǎn),我們可以使用外部校準(zhǔn)將其轉(zhuǎn)換為相機(jī)幀,然后使用內(nèi)部校準(zhǔn)將其轉(zhuǎn)換為像素。
你可以注意到,外部矩陣已經(jīng)被修改了,這是因?yàn)榫仃嚦朔ㄐ枰仃囆螤顏?lái)匹配,因此我們轉(zhuǎn)向了齊次坐標(biāo)。
接下來(lái),讓我們看看它如何與 OpenCV 配合使用。
相機(jī)校準(zhǔn):立體視覺(jué)和 OpenCV
通常,我們使用一個(gè)棋盤(pán)和自動(dòng)算法來(lái)執(zhí)行它。我們告訴算法棋盤(pán)上的一個(gè)點(diǎn)(例如:0,0,0)對(duì)應(yīng)于圖像中的一個(gè)像素(例如:545,343)。
為此,我們必須用相機(jī)拍攝棋盤(pán),獲取一些圖像,校準(zhǔn)算法通過(guò)最小化最小二乘法的損失來(lái)確定相機(jī)的校準(zhǔn)矩陣。
通常,為了消除圖像失真,需要進(jìn)行校準(zhǔn)。針孔相機(jī)模型包括一個(gè)失真,“ GoPro 效應(yīng)”。為了得到校正后的圖像,需要進(jìn)行校準(zhǔn)。畸變可以是徑向的,也可以是切向的。校準(zhǔn)有助于消除圖像的扭曲。
在校準(zhǔn)過(guò)程的最后,你有兩個(gè)校正圖像的參數(shù)K, R,和T:
立體視覺(jué)是基于兩幅圖像尋找深度信息。
我們的眼睛就像兩臺(tái)相機(jī)。他們從不同的角度獲取圖像,計(jì)算兩個(gè)視角之間的差異,并建立一個(gè)距離估計(jì)。
在一個(gè)立體視覺(jué)系統(tǒng)中的兩個(gè)攝像頭,一般在同一高度對(duì)齊。那么,我們?nèi)绾问褂迷O(shè)置和幾何設(shè)計(jì)一個(gè)系統(tǒng)?
假設(shè)你有兩個(gè)相機(jī),其 Y 軸和 Z 軸坐標(biāo)一致,唯一的區(qū)別就是它們的 X 值。
現(xiàn)在兩個(gè)相機(jī) CL (相機(jī)左)和 CR (相機(jī)右)看著一個(gè)障礙 O 。通過(guò)處理幾何關(guān)系,我們可以計(jì)算障礙物的距離。
我們的目標(biāo)是O點(diǎn)的估計(jì)Z軸坐標(biāo)值,即O點(diǎn)的距離(表示圖像中的任何像素)。
-
-
-
-
xL 對(duì)應(yīng)于左側(cè)攝像機(jī)圖像中的點(diǎn)。右側(cè)圖像的 xR 相同
-
根據(jù)上述參數(shù),我們可以用相似三角形得到這張圖中的兩個(gè)方程。
當(dāng)我們進(jìn)行數(shù)學(xué)運(yùn)算后,我們可以快速得到 Z,甚至可以推導(dǎo)出 X 和 Y。
視差是同一 3D 點(diǎn)在 2 個(gè)不同相機(jī)角度的圖像位置差異。
具體來(lái)說(shuō),如果我取左邊圖像的側(cè)視鏡像素(300,175);其在右邊的圖像像素位置位(250,175)。
在本例中,xL=300 且 xR=250。視差為 xL-xR;或者是 50 像素。它是通過(guò)相同的算法估算出來(lái)的。
為每個(gè)像素計(jì)算視差,你會(huì)得到一個(gè)視差圖!正如下圖所示,近距離的物體比遠(yuǎn)距離的物體要亮,遠(yuǎn)距離的物體用深色表示。我們已經(jīng)有了一種深度信息了。
為了計(jì)算視差,我們必須找到左側(cè)圖像中的每個(gè)像素并將其與右側(cè)圖像中的每個(gè)像素匹配。這稱(chēng)為立體匹配。
在左側(cè)圖像中取一個(gè)像素,要在右側(cè)圖像中找到對(duì)應(yīng)的像素,只需在極線上搜索。而不需要進(jìn)行2D搜索,點(diǎn)應(yīng)該位于這條線上,搜索范圍縮小到1D。
在上面的例子中,通過(guò)校準(zhǔn)和校正后,左右兩側(cè)相機(jī)在相同的高度上。我們只進(jìn)行一維搜索。
對(duì)級(jí)搜索可以通過(guò)許多不同的方式進(jìn)行:局部方法、全球方法、半全球方法、深度學(xué)習(xí)。OpenCV 的基本功能可以解決這個(gè)問(wèn)題,但不如當(dāng)前的深度學(xué)習(xí)方法精確。
我們有兩個(gè)視差圖,它基本上告訴我們兩幅圖像之間像素的移動(dòng)。對(duì)于每個(gè)攝像機(jī),我們還有一個(gè)投影矩陣:P _ left 和 P _ right 。
為了估計(jì)深度,我們需要估計(jì) K , R 和 t 。
深度圖
深度圖使用另一幅圖像和視差圖告訴我們圖像中每個(gè)像素的距離。
-
-
使自平移向量 ?? 的相應(yīng)值計(jì)算基線 ??;
-
使用我們之前的公式和計(jì)算的視差map d計(jì)算圖像的深度圖。
對(duì)每個(gè)像素進(jìn)行計(jì)算,并得到深度圖:
我們得到了每個(gè)相機(jī)的深度圖,現(xiàn)在我們將其與諸如 YOLO 之類(lèi)的障礙物檢測(cè)算法相結(jié)合。對(duì)于每個(gè)障礙物,此類(lèi)算法將返回一個(gè)包含 4 個(gè)數(shù)字的邊界框:[x1; y1; x2; y2]。這些數(shù)字代表框的左上點(diǎn)和右下點(diǎn)的坐標(biāo)。
例如,我們可以在左側(cè)圖像上運(yùn)行此算法,然后使用右側(cè)深度圖。
現(xiàn)在,在那個(gè)邊界框中,我們可以取最近的點(diǎn)。我們知道這一點(diǎn),因?yàn)橛捎谏疃葓D,我們知道圖像中每個(gè)點(diǎn)的距離。邊界框中的第一個(gè)點(diǎn)將是我們與障礙物的距離。
好了!我們就構(gòu)建了一個(gè)立體視覺(jué)!