残缺棋盘的伪代码_伪激光雷达:无人驾驶的立体视觉
激光雷達成本高,用廉價的立體視覺替代它可行嗎?
作者:Jeremy Cohen編譯:McGL
公眾號:PyVision(歡迎關注,專注CV,偶爾CS)
Pseudo-LiDAR — Stereo Vision for Self-Driving Cars
https://medium.com/think-autonomous/pseudo-lidar-stereo-vision-for-self-driving-cars-41fa1ac42fc9
深度學習和計算機視覺在自主系統中已經瘋狂地流行起來,現在到處都在使用。計算機視覺,尤其是目標檢測,在過去的十年中發展迅速。
像 YOLO 或 RetinaNet 這樣的障礙物檢測算法提供了2D的邊界框,邊界框給出了障礙物在圖像中的位置。今天,大多數的目標檢測算法都是基于單目 RGB 攝像頭,不能返回每個障礙物的距離。
為了返回每個障礙物的距離,工程師們將攝像頭與激光雷達(LiDAR)傳感器融合,激光雷達可以返回深度信息。利用傳感器融合技術將計算機視覺和激光雷達的輸出信息進行融合。
這種方法的問題是激光雷達很貴。工程師們使用的一個有用的技巧是對齊兩個攝像頭,并使用幾何學來確定每個障礙物的距離: 我們稱之為偽激光雷達(Pseudo-LiDAR)。
偽激光雷達利用幾何構建了一個深度圖,并將其與目標檢測圖結合起來得到3D距離。
如何利用立體視覺實現距離估計?
為了得到距離,下面是5步偽代碼:
我們開始吧!
1. 內部和外部校準
每個攝像頭都需要校準。校準意味著將一個具有[X,Y,Z] 坐標的(現實世界)3D點轉換為具有[ X, Y]坐標的2D像素。
攝像頭模型
今天的攝像頭使用的是小孔成像模型。
這個想法是使用一個針孔,讓少量的光線通過攝像頭,從而得到一個清晰的圖像。
如果圖像中間沒有這個屏障,每一道光線都會通過,圖像就會變得模糊。它還允許我們確定焦距 f 用于縮放和更好的清晰度。
為了校準攝像頭,我們需要將世界坐標通過攝像頭坐標轉換為像素坐標。
攝像頭校準過程- 從世界坐標到攝像頭坐標的轉換稱為外部校準。外部參數稱為 R(旋轉矩陣)和 T(平移矩陣)。
- 從攝像頭坐標到像素坐標的轉換稱為內部校準。它要求攝像頭的內部值,如焦距,光學中心,...... 內參數是一個矩陣,我們稱為 K。
校準
通過攝像頭校準得到矩陣 K。
通常,我們使用跳棋盤和自動算法來執行它。當我們這樣做時,我們告訴算法棋盤中的一個點(如: 0,0,0)對應于圖像中的一個像素(如: 545,343)。
校準示例
為此,我們必須用攝像頭拍攝棋盤的圖像,比較一些圖像和一些點之后,校準算法將通過最小化最小平方損失來確定攝像頭的校準矩陣。
一般來說,校準是必要的,以消除畸變。針孔攝像頭模型包括一個失真:“ GoPro 效應”。為了得到一個矯正圖像,校準是必要的。畸變可以是徑向的,也可以是切向的。校準有助于消除圖像失真。
- f 是焦距ー(u0,v0)是光學中心: 這些是內參數。
每個計算機視覺工程師必須了解和掌握攝像頭的校準。這是最基本、最重要的要求。我們已經習慣了在線處理圖像,從來不碰硬件,這是一個錯誤。
齊次坐標(Homogeneous Coordinates)
在攝像頭校準過程中,我們有兩個公式來得到從世界到像素空間的一個點 O:
- 世界到攝像頭的轉換
- 攝像頭到圖像的轉換
通過計算,你得到了這個等式:
- 從世界到圖像的轉換
如果你看一下矩陣的大小,它們并不匹配。
2. 對極幾何學(Epipolar Geometry)——立體視覺
立體視覺是基于兩幅圖像尋找深度。
我們的眼睛類似于兩個攝像頭。由于他們從不同的角度看一幅圖像,他們可以計算出兩個視點之間的差異,并建立一個距離估計。這里有一個雙目立體攝像頭設置的例子。你可以在大多數無人駕駛汽車中找到類似的東西。
立體相機如何估計深度?
假設你有兩個攝像頭,一個左,一個右。這兩臺攝像頭在同一個 Y 軸和 Z 軸上對齊。基本上,唯一的區別就是它們的 X 值。現在,看看下面的計劃。
我們的目標是估計 O 點(表示圖像中的任意像素)的 Z 值,即距離。
- X 是對齊軸
- Y 是高度
- Z 代表深度
- 兩個藍色的平面對應著每個相機拍攝的圖像
現在從鳥瞰的角度來考慮這個問題。
立體設置的鳥瞰圖- xL 對應左攝像頭圖像中的點,類似的xR 對應右攝像頭。
- b 是基線,是兩個攝像頭之間的距離。
- 對于左邊的攝像頭:
我們得到 Z = X*f / xL
- 對于右邊的攝像頭:
我們得到 Z = (X - b)*f/xR.
綜合起來,我們可以找到正確的視差 d = xL - xR 和一個物體的正確 XYZ 位置。
3. 視差和深度圖
什么是視差?
視差是同一個三維點從兩個不同的攝像頭角度拍攝的圖像位置的差異。
立體視覺方程式由于立體視覺,我們可以估計任何物體的深度(假設我們已經做了正確的矩陣校準)。
它甚至可以計算一個深度圖或視差圖
為什么是“對極幾何” ?
為了計算視差,我們必須找到左側圖像中的每個像素,并將其與右側圖像中的每個像素匹配。這就是所謂的立體對應問題(Stereo Correspondance Problem)。
為了解決這個問題——
- 取左圖中的一個像素
- 現在,要在右邊的圖像中找到這個像素,只需在極線上搜索它。沒有必要進行二維搜索,點應該位于這條線上,搜索范圍縮小到一維
這是因為攝像頭是沿著同一軸線排列的。
以下是極線搜索的工作原理:
應用: 構建偽激光雷達(Pseudo-LiDAR)
現在,是時候把這些應用到現實世界的場景中,看看我們如何使用立體視覺來估計物體的深度。如下兩張圖片——
這些圖像中的每一個都有外部參數 R 和 t,事先由校準確定(步驟1)。
視差
對于每個圖像,我們可以計算出相對于其他圖像的視差圖。我們將:
我們將得到左側和右側圖像的視差圖。
為了幫助你更好地理解視差的含義,我找到了這個 Stack Overflow 解釋:
從視差到深度圖
我們有兩個視差圖,它告訴我們兩張圖像之間像素的位移。
對于每個攝像頭,我們有一個投影矩陣—— P_left 和 P_right。
為了估計深度,我們需要估計 K,R 和 t。
- 每個攝像頭用OpenCV 函數 cv2.decomposeProjectionMatrix () 可以從 P 中得到 K、 R 和 t
深度圖
現在是生成深度圖的時候了。
利用另一張圖像和視差圖,深度圖可以告訴我們圖像中每個像素的距離。整個過程如下:
- 從 K 矩陣得到焦距 f
- 使用平移向量 t 中的對應值計算基線 b
- 使用之前的公式和計算出的視差圖 d 計算圖像的深度圖:
我們對每個像素進行計算。
估計障礙物的深度
每個攝像頭我們都有了一個深度圖!現在,假設我們把這個和一個障礙物檢測算法結合起來,比如 YOLO。對于每個障礙物,這樣的算法將返回一個包含4個數字的邊界框: [x1; y1; x2; y2]。這些數字表示框的左上角和右下角的坐標。
例如,我們可以在左邊的圖像上運行這個算法,然后使用左邊的深度圖。
現在,在那個邊界框里,我們可以得到最近的點。我們知道它,因為我們知道圖像中每一個點的距離,這要歸功于深度圖。邊界框的第一點將是我們到障礙的距離。
Wow! 我們剛剛建立了一個偽激光雷達!
由于立體視覺,我們不僅知道圖像中的障礙物,還知道它們與我們的距離!這個障礙物離我們有28.927米遠!
立體視覺是使用簡單的幾何學和一個額外的攝像頭將二維障礙物檢測轉化為三維障礙物檢測的方法。今天,大多數新興的“邊緣”平臺支持立體視覺,如新的OpenCV AI Kit或樹莓派和英偉達Jetson。
在成本方面,與使用激光雷達相比,它相對便宜,并且仍然提供了很好的性能。我們稱之為“偽激光雷達” ,因為它可以取代激光雷達的功能: 檢測障礙物,對障礙物進行分類,并對障礙物進行三維定位。
References:
- Course Visual Perception for Self-Driving Cars by University of Toronto
總結
以上是生活随笔為你收集整理的残缺棋盘的伪代码_伪激光雷达:无人驾驶的立体视觉的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装mysql提示找不到msv_安装my
- 下一篇: apache nginx mysql p