本文的圖片和代碼大多來自優達無人駕駛工程師課程,目的是為了記錄自己學習過程總結經驗錯誤,侵刪。
目前工程師促使自動駕駛一般采用兩種不同方式:機器人技術和深度學習。很多年來,機器人技術用於融合一套傳感器輸出的數據直接測量汽車周邊環境然后駕駛。近期,開始使用深度學習,模仿人類駕駛行為。機器人技術和深度學習方法都在運用發展。
這是 Udacity 無人駕駛課程的項目1,在python中實現。
一、檢測車道 Color Selection
教車開車,教車感知世界。用攝像頭和傳感器獲取車道線信息。第一個模塊是編寫代碼識別和跟蹤一系列圖像中車道線的位置。基於圖像分析技術。
簡單地說就是把路面上的行車線找出來。由於行車線的顏色與周圍環境有一定區分,我們可以對RGB分別設定閾值,把有用的信息分離出來。
車道線在圖像中顯示是白色的。數字圖像由紅綠藍三個圖像組成,有時也叫作3個顏色通道。每個顏色通道的像素值從0到255不等。0是最暗的部分,255是最亮的部分。
練習題:如果0是黑暗的255是亮的,在紅綠藍三個圖像組合的圖像里面,純白怎么表示呢?
答案:[255,255,255]
步驟:
1.加載numpy和matplotlib庫
2.獲取坐標軸並拷貝圖片
3.定義顏色閾值
4.選擇像元並輸出
1 #1.導入庫 2 import matplotlib.pyplot as plt #Matplotlib 是一個 Python 的 2D繪圖庫 3 import matplotlib.image as mpimg 4 import numpy as np #NumPy是Python的一種開源的數值計算擴展 5 6 #2.讀取圖片並輸出狀態:得到x和y軸的數值,對圖片進行拷貝(copy) 7 image=mpimg.imread('E:/spyder/a/a/test.jpg') 8 print('This image is :',type(image), 9 'with dimensions:',image.shape) 10 ysize=image.shape[0] #獲取x軸和y軸並對圖片進行拷貝 11 xsize=image.shape[1] 12 color_select=np.copy(image) #用copy拷貝而不是用‘=’ 13 14 #3.接下來,我在變量red_threshold,green_threshold和blue_threshold中定義顏色的閾值,並用這些值填充rgb_threshold。 這個矢量包含我在選擇時允許的紅色,綠色和藍色(R,G,B)的最小值。 15 red_threshold=0 16 green_threshold=0 17 blue_threshold=0 #若紅綠藍的閾值都設置為0,則說明圖片的全部像素都被選中 18 rgb_threshold=[red_threshold,green_threshold,blue_threshold] 19 20 #4.接下來,我將選擇閾值以下的任何像素並將其設置為零。之后,符合我的顏色標准(高於閾值)的所有像素將被保留,而那些不符合閾值的像素將被黑掉。 21 #用布爾值或者'|'來識別低於閾值的像元 22 thresholds= (image[:,:,0]<rgb_threshold[0]) \ 23 | (image[:,:,1]<rgb_threshold[1]) \ 24 | (image[:,:,2]<rgb_threshold[2]) 25 color_select[thresholds]=[0,0,0] #color_select 是選擇像素高於閾值的結果,低於閾值的顯示黑色。 26 27 plt.imshow(color_select) #顯示圖像 28 plt.show()
結果如下圖
若將21~23的代碼設計如下:
21 red_threshold=200 22 green_threshold=200 23 blue_threshold=200
結果如下圖
最終,我發現在red_threshold = green_threshold = blue_threshold = 200的情況下,我得到了一個相當不錯的結果,在這里我可以清楚地看到車道線,但其他大部分內容都被遮住了。
然而,在這一點上,自動提取准確的線條仍然很棘手,因為我們周圍還有許多其他的像素。
若將21~23的代碼設計如下:
21 red_threshold=150 22 green_threshold=250 23 blue_threshold=150
結果如下圖