利用計算機視覺進行道路檢測,一般包括6部分:攝像頭校正(camera calibration)、影象失真校正(distortion correction)、色彩/梯度二值化(color/gradient threshold)、視角轉換 Perspective transform 、行道線檢測(Detect lane lines)、 道路彎度測量(Determine the lane curvature)

Calibration 校正

首先要對失真的程度進行測量,然後根據measurement的結果進行undistort

這個東西叫做chessboard pattern, 用的時候從不同的角度拍這個chessboard,利用的是每個方塊的corner去校正 (影象要記得轉成灰度圖) 得到的結果其實只跟拍照的相機有關。對於每個的鏡頭,要單獨做一遍這種校正。

Distorition 影象失真

理論上,只要不是針孔攝像機,基本都會存在影象失真的問題(透鏡成像更快點,針孔相機這點上比不了) 影象失真會影響到道路檢測(將直線判斷成曲線),車輛檢測(用CNN檢測的時候,識別出來的車比實際更大或者更小)

由透鏡引起的失真主要是兩個:

  • 徑向畸變(Radial Distortion) 原因是光線穿過透鏡的邊緣時發生的偏轉大於穿過中心發生的偏轉

  • 切線畸變(Tangential Distortion) 原因是光線穿過透鏡之後並沒有垂直打在成像平面上

ROI (Region of Interest)

道路檢測要先從攝像頭視角獲取道路資訊,然後選取ROI(目標區域), 包括選顏色和選區域。

選顏色比較接近直覺, 路上的線也就兩種顏色,要麼白線,要麼黃線。 白線其實比較好找 color selection

但是黃線的話就不能直接用原圖了。要先把原圖分成RGB三層 yellow line

而黃色的線在藍色那層是看不到的 RGB (因為是互補色) 光的三原色

選區域是可以直接利用CV解決的問題。 從車頭視角向前看,大部分畫素都是沒有用的。尤其是天空的部分。對於自動駕駛來說差不多等價於干擾訊號,基本上可以直接過濾掉 車頭視角 區域選擇

Color Space 色彩空間

在RGB色彩空間(以RGB建立三維空間)中,白色是由紅綠藍三種顏色的最大值組成的。 因此想獲得白線,可以通過設定RGB值的閾值

但是這種情況下,會丟失黃線的資訊。一般的處理方式是使用別的色彩空間,比如HSV, HLS, LUV… 其中HSV(色相、飽和度、明度)和HLS(色相、亮度、飽和度)使用最多

HLS (hue, saturation, lightness)

也叫HSL,甚至叫HSL的還更多點。 其實影象本身在光亮條件下變化最大,HS通道一般倒是不怎麼變。所以我們把影象按照HSL拆分,在S通道下黃線非常明顯

Canny Edge Detection

下一步是使用邊緣檢測演算法尋找邊線。如果我們把檢視當成一張灰度圖來看待,那麼每一條邊其實都在明暗塊交替的位置 通過計算亮度的變化,可以把原圖轉化成一張梯度圖 然後再將結果銳化,得到亮度數值變化最大的畫素點

實際上,在做Canny演算法之前,要對影象做高斯平滑(Gaussian smoothing / Gaussian Blur) ,消除噪聲和偽梯度點

(題外話) Sobel Operator 索伯運算元

首先,為什麼卷積神經網路會有卷積(convolution)這種操作… 看完Sobel運算元總算懂了,卷積這種運算講究的是一個訊號疊加。相比於Canny邊緣檢測,Sobel邊緣檢測其實更容易理解(然而還是Canny效果好)。

Hough Transform 霍夫變化

Hough Transform是影象變化中的經典演算法,主要用來尋找影象中符合某種特徵的集合,說白了就是檢測直線、圓、橢圓。 Hough變化要將笛卡爾座標下的點變化到霍夫極座標系,原來的點共線問題會由此轉化計算成曲面在極座標下的共點,效果上就是該演算法對邊緣間斷不敏感。大致上是這個意思,實際操作的時候是統計累加空間裡的區域性最大值(峰值),以該峰值作為結果(所以說抗噪能力還是很強的)。

總結一下就是: 原圖 -> 灰度圖 -> 邊緣檢測 -> 直線檢測 -> 過濾掉斜率過低的直線 -> 將最後結果疊加回原圖

原圖

灰度圖&邊緣檢測

最後結果疊加回原圖

Perspective Transform

由於Perspective的存在,2D影象存在近大遠小的現象 這樣會導致原本平行的行道線,出現匯聚的趨勢 因此需要把視角轉換成俯視 將行道線還原到平行

Lane Curvature

解決道路彎曲(Lane Curvature)問題,實際上比較複雜。先要依次校正原圖 lc 選取ROI 然後要進行視角轉換(Perspective Transform) 最後根據俯檢視(Top-down view) 用二次函式擬合行道線

Sliding windows 滑動視窗

在檢測弧線的過程中,首先在影象底部選取一小段,在垂直方向做直方圖 將頂點連線,變成峰值圖 出現峰值的地方是行道線的位置 以此為起點,使用逐步向上移動,每次處理一小段影象 這種檢測模式叫做滑動視窗 一旦擁有了第一幀的行道線位置,在隨後的檢測中可以利用邊緣檢測 + ROI 的方式獲得之後的行道線

得到道路的二次函式並沒有用,從駕駛的角度來看,真正需要的是當前的轉彎弧度。所以需要求出圖片組的曲率半徑(radius of curvature),在對應計算出現實中的曲率半徑

總結自Udacity無人車專項,合集版在掘金更新