日本无码免费高清在线|成人日本在线观看高清|A级片免费视频操逼欧美|全裸美女搞黄色大片网站|免费成人a片视频|久久无码福利成人激情久久|国产视频一二国产在线v|av女主播在线观看|五月激情影音先锋|亚洲一区天堂av

  • 手機站
  • 小程序

    汽車測試網(wǎng)

  • 公眾號
    • 汽車測試網(wǎng)

    • 在線課堂

    • 電車測試

基于圖像處理的車道線檢測

2020-10-24 22:12:22·  來源:汽車電子與軟件  作者:Archit Rastogi  
 
在視頻中編寫一個車道線檢測系統(tǒng),這聽起來如何?2017年的時候,我和Udacity一起做這個項目的時候,我覺得非???。那時,我們的目標(biāo)只是了解足夠的基礎(chǔ)知識,并
在視頻中編寫一個車道線檢測系統(tǒng),這聽起來如何?2017年的時候,我和Udacity一起做這個項目的時候,我覺得非常酷。那時,我們的目標(biāo)只是了解足夠的基礎(chǔ)知識,并編寫一個系統(tǒng)代碼,以某種方式獲得最終結(jié)果,從而感受到計算機視覺的力量,即使你不懂技術(shù)。然而,這篇文章的主要目的是解讀圖像處理技術(shù),更多關(guān)注的是過程而不是目的。
目的是識別圖像中的車道線,然后將該算法擴展到視頻中,從而有效地識別左右車道線,不管它是什么形狀(實線與虛線),什么顏色(白色與黃色),坡度多大(直線、角度或曲線)。該項目使用的圖像/視頻是在美國一條高速公路上拍攝的,這條路上車道線標(biāo)記得很清楚,車道線大多是直的,沒有太多彎曲。
 
以下特征用于識別:
  1. 顏色:車道線通常為淺色(白色/黃色),而道路則為深色(深灰色)。因此,黑白圖像效果更好,因為車道可以很容易地從背景中分離出來。
  2. 形狀:車道線通常是實線或虛線,所以可以將它們與圖像中的其他對象分開??梢杂肅anny等邊緣檢測算法找到圖像中的所有邊緣/線條。然后我們可以使用進一步的信息來決定哪些邊可以被限定為車道線。
  3. 方向:公路車道線更接近于垂直方向,而不是水平方向。因此,在圖像中檢測到的直線的斜率可以用來檢查它是否可能是車道。
  4. 在圖像中的位置:在一個由行車記錄儀拍攝的常規(guī)公路圖像中,車道線通常出現(xiàn)在圖像的下半部分。因此,可以將搜索區(qū)域縮小到感興趣的區(qū)域,以減少噪聲。
顏色選擇 
每個圖像都由不同的色彩通道組成。在RGB配色方案中,圖像中的每個像素都由紅、綠、藍三個通道的值組成。這些值在0到255之間變化,0是最暗的,255是最亮的。這樣,白色為[255,255,255],黑色為[0,0,0]。如果取三者的平均值并將該值運用到每個像素上,那么就會得到一個灰度圖像。
 
 
為了得到一個灰度圖像,我使用了以下代碼:
 
這里,在變量“red_threshold”,“green_threshold”, “blue_threshold”中定義顏色閾值(rgb_threshold)。此向量包含選擇中允許的紅色、綠色和藍色(R、G、B)的最小值,任何高于這些值的數(shù)值都會歸為零(禁用)。在車道線與道路形成對比的情況下,這種方法尤其有效,因此我們可以設(shè)置最小值。
 
 最后,在“color_select”生成的圖像中,高于閾值的像素被保留,低于閾值的像素被遮住。
區(qū)域遮罩
下一個任務(wù)是區(qū)域遮罩。如果我們假設(shè)圖像來自安裝在車上固定位置的行車記錄儀,那么車道線只會出現(xiàn)在行車記錄儀上的某個特定區(qū)域。這可以用來縮小搜索范圍。在這里我們可以定義一個三角形,如下圖所示,并且只使用其中的區(qū)域進行搜索。
 
在下面的代碼中,變量“left_bottom”、“right_bottom”和“apex”用作三角形區(qū)域的頂點,我希望保留該區(qū)域用于顏色選擇,同時屏蔽其他區(qū)域。我這里使用三角形選擇興趣區(qū)域,但原則上,使用任何多邊形都是可以的。
應(yīng)用區(qū)域遮罩后,最終圖像將如下所示:
 
我們可以將這兩種策略結(jié)合起來,如下代碼所示:
 
 
將顏色和區(qū)域遮罩后的圖像放到原始圖像上,以指示車道線,如下所示:
 
如圖所示,顏色檢測能夠標(biāo)記車道線。然而,這仍然不是車道線檢測的好方法。如果車道線是只有一種顏色的話,比如車道線是白色的,路面是黑色的,那么檢測就更容易。然而,很多時候車道線不只一種顏色(黃色、白色等),它們可能是實線或虛線。因此,我們需要一種更智能的算法來尋找視頻中的車道線,而這正是邊緣檢測的切入點。
Canny邊緣檢測
有時在計算機視覺項目中,可以通過物體的形狀檢測到物體。為了確定圖像中物體的形狀,需要進行邊緣檢測。
Canny邊緣檢測器是一種邊緣檢測算子,它使用多階算法盡可能多地檢測圖像的邊緣。它是由John F. Canny在1986年提出的。——維基百科
通常使用灰度圖像,因為在灰度圖像中,更容易檢測到圖像邊緣?;叶葓D像可以想象成一個二維矩陣函數(shù),每個像素都是包含x和y值的矩陣元素。因此我們可以進行數(shù)學(xué)運算,比如在x和y方向上取一個梯度。邊緣只是像素亮度的瞬時變化。
 
在x和y方向上取一個表示像素亮度的斜率。斜率通常會給出一個粗略的邊緣,然后在此基礎(chǔ)上應(yīng)用閾值以獲得實際像素。
 
Canny邊緣檢測算法由以下步驟組成:
  1. 降噪:由于該算法所涉及的數(shù)學(xué)模型主要是基于導(dǎo)數(shù)的,所以邊緣檢測結(jié)果對圖像噪聲非常敏感。去除圖像噪聲的一種方法是應(yīng)用高斯模糊對其進行平滑處理。為此,使用圖像卷積技術(shù)和高斯函數(shù)(3x3、5x5、7x7等)。預(yù)期的模糊效果決定內(nèi)核的大小?;旧?,內(nèi)核越小,模糊越不可見。
  2. 梯度計算:平滑后的圖像用Sobel算子在水平方向和垂直方向上進行濾波,得到兩個方向的一階導(dǎo)數(shù)。從這兩幅圖像中,我們可以找到每個像素的邊緣梯度和方向,如下所示:
 
  1. 非極大值抑制:在得到梯度大小和方向后,對圖像進行整體掃描,以去除可能不構(gòu)成邊緣的所有不需要的像素。為此,在每個像素處,檢查像素是否是在其鄰域內(nèi)沿梯度方向的局部最大值。
  2. 滯后邊緣跟蹤:這個階段決定哪些是真正的邊緣,哪些不是。為此,我們需要兩個閾值,最小值和最大值。強度梯度大于最大值的邊肯定是實際邊緣,小于最小值的邊肯定不是實際邊緣,所以舍去。那些位于這兩個閾值之間的是基于連通性的邊緣或非邊緣。
在openCV中,cv2.Canny函數(shù)可以用來尋找灰度平滑圖像的邊緣。以下是完整代碼:
 
邊緣檢測后得到的圖像:
 
目前得到的圖像中的所有邊都是可見的,但是如何從邊緣檢測到的圖像中提取車道線?現(xiàn)在我們有了所有代表邊的點,需要把這些點連起來。這就是霍夫變換的用武之地。
霍夫變換
在圖像空間中,一條線可以用x,y來表示,但是在1962年,Paul Hough設(shè)計了一種在參數(shù)空間中表示線的方法,我們稱之為“霍夫空間”,以紀(jì)念他為此做出的貢獻。
直線方程可以表示為y=mx+b,其中m是斜率,b是截距。在“霍夫空間”中,可以將圖像空間中的點(x0,mx0+b0)表示為(m0,b0)。霍夫變換就是從圖像空間到霍夫空間的轉(zhuǎn)換。因此,圖像空間中的直線的特征就是霍夫空間中(m,b)位置上的一個點。
 
有很多條線可能會穿過圖像空間中的一個點,但并非任意一條線,只有那些具有m和b參數(shù)的特定組合的線。重新排列直線方程,我們發(fā)現(xiàn)一個單點(x,y)對應(yīng)于直線b=y-xm。因此,圖像空間中的一個點對應(yīng)于霍夫空間中的一條直線。因此,如果我們在圖像空間中畫出各種可能的點,并在霍夫空間中畫出相應(yīng)的直線,那么在霍夫空間中各種直線的交點就是圖像空間里通過這些點的直線。這個概念用于識別圖像中的各種線條。
 
現(xiàn)在使用笛卡爾坐標(biāo)表示的直線可能會在直線垂直的情況下產(chǎn)生問題,因為坡度大于無窮大。為了消除這種異常,使用極坐標(biāo)。
 
要在OpenCV中應(yīng)用霍夫變換,需要使用一個名為HoughLinesP的函數(shù),該函數(shù)有多個參數(shù)。
 
在這種情況下,我們對圖像屏蔽的邊緣(Canny的輸出)進行操作,HoughLinesP的輸出將是線,它將只是一個數(shù)組,包含通過霍夫變換檢測到的所有線段的端點(x1、y1、x2、y2)。其他參數(shù)定義了我們要尋找的線段類型。
首先,rho和theta是霍夫空間中網(wǎng)格的距離和角分辨率。需要以像素為單位指定rho,以弧度為單位指定theta。
Threshold(閾值)參數(shù)指定候選行進入輸出所需的最小投票數(shù)(給定網(wǎng)格單元中的交叉點)??盏膎p.數(shù)組([])只是一個占位符,無需更改。min_line_length是你將在輸出中接受的一條線的最小長度(以像素為單位),max_line_gap是允許連接成一條直線的線段之間的最大距離(同樣以像素為單位)。然后,你可以迭代輸出行并將它們繪制到圖像上,以查看最終結(jié)果!
以下是最終代碼:
 
應(yīng)用Canny邊緣檢測和霍夫變換后得到的圖像:
 
總結(jié)
現(xiàn)在,所有這些概念都被用來識別視頻中的車道線。該流程使用以下步驟標(biāo)記車道線:
  1. 將圖像轉(zhuǎn)換為灰度圖像:使用OpenCV函數(shù)cv2.cvtColor()將圖像轉(zhuǎn)換為灰度。這使得識別車道更加容易,也有助于下一步的邊緣檢測。采用高斯模糊算法對單元值進行平均化處理,以減少噪聲。
  2. Canny邊緣檢測:接下來利用圖像的梯度來計算圖像中物體的邊界或邊緣。Canny(模糊灰度、低閾值、高閾值)是用于執(zhí)行Canny邊緣檢測的函數(shù),其中低閾值和高閾值是用于檢測邊緣的強度的閾值。我們使用的值為low_threshold=50 high_threshold=150。
  3. 選擇興趣區(qū)域:接下來定義一個四邊形來遮罩感興趣的區(qū)域。如前所述,可以找到車道線的圖像部分被識別出來,在我們的例子中,是圖像下半部分,用多邊形對搜索區(qū)域進行限定,而圖像的其他區(qū)域則被屏蔽。
  4. 霍夫轉(zhuǎn)換:一旦在圖像中檢測到像素邊緣,就會運用霍夫變換連接這些邊緣像素點,以組成車道線。HoughLinesP是一個函數(shù),它從Canny獲取輸入圖像和一些其他參數(shù),以便定義車道線?;舴蜃儞Q的輸出包含所有車道線(實線/虛線)。下一步是找到一條共同的平均線來平滑所有車道線。
  5. 求直線的平均方程和平滑:一旦線條在圖像中被識別出來,它們就被傳遞到繪制線(line_img,lines)函數(shù)中,該函數(shù)可以找到直線的平均方程。它通過計算坡度來劃分左右車道線。負值對應(yīng)于從右到左的正值(基于圖像坐標(biāo))。 一旦有了獨立的左/右直線,則通過累積每個左/右線中的所有點并通過這些點找到平均擬合來計算每個左/右直線的坡度和截距。
  6. 外推法:一旦有了平均左/右線,他們將外推生成一個共同的平均車道線(實線)。一旦流程開始處理測試圖像。對視頻的每一幀進行相同的操作,以生成整個視頻中的車道線。
即使車道線顏色不同(黃色、白色),形狀不同(實線、虛線等),這個流程最終也能在視頻中檢測到車道線。
即使代碼在車道線是直線的情況下效果很好,但當(dāng)直線更彎曲時,效果就不太理想了,我們在方程中擬合直線。另外,當(dāng)燈光變化時,該算法很難檢測到車道。未來可以通過使用二次多項式來解釋曲線車道,以及使用不同的車道識別技術(shù)以獲得更精確的結(jié)果這兩種方法來改進目前的方案。 
分享到:
 
反對 0 舉報 0 收藏 0 評論 0
滬ICP備11026917號-25