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

  • 手機(jī)站
  • 小程序

    汽車(chē)測(cè)試網(wǎng)

  • 公眾號(hào)
    • 汽車(chē)測(cè)試網(wǎng)

    • 在線課堂

    • 電車(chē)測(cè)試

基于圖像處理的車(chē)道線檢測(cè)

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