自駕車學習之路(二)

用影像處理做車道偵測

Hsin-Cheng Chao
5 min readMar 18, 2017

前言:

這次是把作業一和作業四寫在一起,這兩個作業基本上是要做一樣的事情只不過是用不同的方法。至於為什麼要寫這個作業還有上這個課請參考第一集

目標

這次作業的目標是要用影像辨識偵測出前方的車道,開車的人應該會有這種感覺: 平常高速公路上幾乎只要無腦的把車子開在兩條線的中間,和前車保持安全距離就可以平安的抵達目的地了,根本不太需要用腦。偏偏這種長時間的無聊事是非常累人的,這就是人工智慧登場的最佳時刻啦!

作業一用的方法是很直覺的偵測畫面左右兩條白色的直線,但路上除了有白色實線外還有黃線,虛線,和其他很多看起來很像直線的東西,也會有白車,白色的鳥,白色的雲…等。因此首先我們要排出一些畫面上我們沒有興趣的區域(例如: 天空,其他車道…) 然後再在影像中排除一些我們不要的顏色,只留下白色跟黃色。

目標是要找出前方的車道 (左為原圖 中為有興趣的顏色 右為有興趣的區域)

用上述的兩種方法可以找出我們在意的 pixel,但要找出線還得配合 Canny Edge Detection 外加使用 Hough Transform ,Hough Transform 是一種很酷的轉換,能把畫面上的一個點在Hough space上轉換成一條線,把一條線轉換成一個點,因此照片中的原本一條直線上的pixels在Hough space上會被轉換成相交於同一個點的許多直線!

然後過濾掉一些不合理的斜率,我們就可以找出車道的左右兩條線啦!opencv 非常貼心的都幫我們把上面的演算法給時坐好了,使用起來非常方便!經過一番努力,我終於實驗出了滿意的參數

偵測出的線段

最後再把畫面左右的直線分別取平均並且延長,然後把測試的影片丟下去跑,得到如下的結果。

Naive Lane Detection

邁向更進階的偵測(Project 4)

以上是Project 1,但故事還沒結束,這樣的結果其實還不是很理想,車道並不是只有直線,常常是微微地向右或向左彎,所以上述的方法沒辦法告訴我們車道到底是往左彎還是往右彎… 所以我們需要 鳥的視角 來看這個影片

在瞭解了一般攝影機的 Pinhole model 和攝影機的角落的魚眼效果後,我就開始使用Udacity事先提供的攝影機棋盤照片來算出Distortion matrix並對攝影機進行校正

經過校正的棋盤照片就沒有魚眼效果

當攝影機影像沒有魚眼效果之後,我們就可以透過簡單矩陣的運算來做視角轉換,把行車記錄器的影片轉換成空中的鳥瞰圖!這樣一來我們就可以看出路上的線到底是直線還是向左或是向右彎了!

接下來就是最複雜的部分了,我們知道左右兩條線不一定是直線而是有弧度的曲線,所以我們要找出所有可能是地上線段的區域。這次用了兩種方法,第一個是用Sobel Edge Detection 來找出適合的斜率的Edge,另外一個是再不同的Color Space上面尋找適合的Color Channel,避免光影造成錯誤的判斷(強光下的柏油路看起來很像白色或黃色)。結合兩種方法我們可以得到下圖右的bit map.

紅色為 Sobel Edge Detection的結果 綠色為 S (HLS)channel threshold 強度偵測

最後把先用Sliding window找出左右兩條線的pixel 然後再分別去Fit一個二次多項式後 我們可以找到一個最適合的圓弧,也就是偵測出左右兩條曲線了!

用Sliding window 跟 convolution 來找出左右兩條線

最後再把偵測出來的線段畫回影片上面,並且把兩條線中間標示成馬路!

結論

不得不說最後的影片看起來很厲害 XD 可以偵測出車子偏離路中間的程度還有前方道路的曲率半徑,但在一些奇怪的光影和顛簸的路面時,還是容易出問題,因為當車子晃動時攝影機的仰角會改變,這也是為什麼影片40秒左右的時候偵測的不太準。而且就在我作業寫完的隔幾天就看到這個Tesla車禍的影片

看來只看地上的線還是不太靠譜啊!!!

最後附上 source code 給有興趣的朋友

--

--

Hsin-Cheng Chao
Hsin-Cheng Chao

Written by Hsin-Cheng Chao

Full-stack python engineer by day, Self-Driving Car student by night!