基于Python的复杂环境中车道线自动检测系统
正常版:在馬路上尋找車道線
在這個(gè)項(xiàng)目中,本文建立了一個(gè)計(jì)算機(jī)視覺(jué)算法,用于檢測(cè)車道線并創(chuàng)建平均和外推的邊界線。 流程如下:
1)將幀轉(zhuǎn)換為灰度;
2)為黃色和白色像素創(chuàng)建蒙版;
3)應(yīng)用高斯平滑;
4)應(yīng)用Canny邊緣檢測(cè);
5)創(chuàng)建一個(gè)額外的遮罩,以專注于車輛前方的“感興趣區(qū)域”;
6)將XY空間中的點(diǎn)(即像素)轉(zhuǎn)換為霍夫空間中的線;
7)霍夫空間中的線相交(即點(diǎn))的地方,XY空間中存在一條線;
8)使用生成的線的極值,創(chuàng)建兩條平均線s;
9)在整個(gè)幀中創(chuàng)建兩條平均線,以實(shí)現(xiàn)流暢的視頻播放;10)在每幀上畫(huà)線。
| 從霍夫空間轉(zhuǎn)換后的原始線 | 可流暢播放的平均線 |
工作流程:
1)檢查霍夫返回的每條線,并根據(jù)其坡度確定是在左車道還是右車道。因?yàn)槲覀冋趯?duì)陣列進(jìn)行“上下顛倒”,所以左側(cè)車道的斜率為負(fù),右側(cè)車道的正值為;2)極值;3)計(jì)算平均值;4)解決b截距;5)用極值求積分;6)流暢的幀和緩存。
| 從霍夫空間轉(zhuǎn)換后的原始視頻 | 可流暢播放的車道線視頻 |
困難版: 這篇文檔為自動(dòng)駕駛汽車的車道線檢測(cè)和跟蹤提供了強(qiáng)大的解決方案。
步驟如下所示:
1)相機(jī)校準(zhǔn);2)失真校正;3)漸變和顏色閾值;4)透視變換;5)車道線搜索和搜索優(yōu)化;6)繪制車道覆蓋。
相機(jī)校準(zhǔn)
我們需要在棋盤上存儲(chǔ)對(duì)象點(diǎn)的數(shù)量或感興趣的位置。 僅考慮不在最外邊緣上的點(diǎn)。 對(duì)于此板,X軸上有9列,而7軸上有6行。 我們需要每種組合的(x,y,z)坐標(biāo)列表(即板上唯一的位置)。 每個(gè)z值都是2D圖像,因此將為零。
失真校正
漸變和顏色閾值
對(duì)于此項(xiàng)目,我們將使用幾個(gè)過(guò)濾器來(lái)生成二進(jìn)制(黑白)圖像,我們可以使用該圖像檢測(cè)和跟蹤車道線。
1)x和y方向的Sobel漸變;2)漸變幅度;3)漸變方向;4)色彩空間變換和過(guò)濾。
| 原始圖片 | Sobel Gradients |
| Gradient Magnitude | Gradient Direction |
飽和通道和紅色通道濾波器
首先,漸變?yōu)V鏡會(huì)將原始圖像轉(zhuǎn)換為灰度,并且丟失了許多有用的信息。車道線可以是黃色或白色,我們可以利用它來(lái)嘗試定位和跟蹤它們。色相飽和度亮度色彩空間將有所幫助。特別是,HSL圖像的S通道保留了大量有關(guān)車道線的信息-尤其是在道路上有陰影時(shí)。RGB的紅色通道在創(chuàng)建車道線的二進(jìn)制圖像方面也做得很好。
| HSL圖像 | RGB圖像 |
組合過(guò)濾方法
現(xiàn)在,我們可以混合并匹配不同的過(guò)濾器方法,每種方法都具有唯一的閾值,以獲取精確的二進(jìn)制圖像。
我測(cè)試了許多不同過(guò)濾器的許多按位組合。他們對(duì)于圖像整體都產(chǎn)生了不同的結(jié)果,但是這種組合在保留黃色車道線的信息方面做得最好,尤其是當(dāng)距離越來(lái)越遠(yuǎn)且在陰影下時(shí)。我將所有其他濾鏡都留在了里面,因?yàn)樗鼈冊(cè)诓煌墓庹諚l件下可能會(huì)有用。 需要更多測(cè)試圖像-尤其是夜間圖像!
看起來(lái)還不錯(cuò)! 它并沒(méi)有像我想要的那樣捕捉到遠(yuǎn)處的黃色車道線。它顯然會(huì)在樹(shù)投射的陰影下丟失該信息。
得到一個(gè)不變形的行車記錄儀框架
我們可以在此處看到,當(dāng)陰影距離相機(jī)更近/更大時(shí),管道在解決陰影下的線條方面做得更好。 但是,它仍然不完美。
透視變換
檢測(cè)車道線
現(xiàn)在,我們對(duì)道路的快照已完成轉(zhuǎn)換,我們準(zhǔn)備查找并跟蹤實(shí)際的車道。 為此,我們可以識(shí)別出大量白色像素區(qū)域。 具體來(lái)說(shuō),我們將使用直方圖將像素分為幾列,并尋找分布中的峰值。
我們可以清楚地看到該直方圖中的車道。 通過(guò)設(shè)置滑動(dòng)窗口,我們可以跟蹤由于道路略微彎曲而向左/向右轉(zhuǎn)向的峰。
下面的功能如下:
1)在圖像底部創(chuàng)建一個(gè)搜索窗口,其高度為圖像高度的1/9。
2)將窗口分為左右兩半。
3)通過(guò)直方圖找到具有最高值的像素列。
4)使用空白變量在該區(qū)域周圍繪制一個(gè)框。
5)確定該框中的所有非零像素。如果有足夠的余量,請(qǐng)?jiān)谙乱粋€(gè)窗口平均位置上將框居中。
6)將二次方程式擬合到圖像每一半(左車道和右車道)中標(biāo)識(shí)的所有非零像素。
現(xiàn)在,我們已經(jīng)找到了車道,我們可以優(yōu)化搜索區(qū)域,以加快流程。
下面的功能如下:
1)?導(dǎo)入多項(xiàng)式。2)在像素邊界內(nèi)查找非零像素)3.擬合更新多項(xiàng)式以擬合新數(shù)據(jù)。
在原始圖像上繪制車道
現(xiàn)在我們知道通道在哪里,我們可以將其輸出到實(shí)際的視頻提要。 我們將按照以下步驟進(jìn)行操作:
1)導(dǎo)入多項(xiàng)式;2)在變形后的二進(jìn)制文件的空白副本上繪制多項(xiàng)式曲線;3)填充曲線之間的多邊形;4)使用反透視變換取消扭曲新圖像;5)將車道圖像疊加在原始幀的頂部。
確定車道曲率
現(xiàn)在我們有了車道,我們將要計(jì)算曲率半徑(即,道路彎曲了多少)。 當(dāng)我們需要?jiǎng)?chuàng)建用于控制汽車轉(zhuǎn)向和加速的程序時(shí),此信息對(duì)于端到端學(xué)習(xí)過(guò)程的后期至關(guān)重要。 此過(guò)程中最重要的步驟是將我們的測(cè)量結(jié)果從像素空間轉(zhuǎn)換為公制。 曲率半徑的公式為:
其中二階多項(xiàng)式f(y)定義為:
請(qǐng)注意,它是f(y)而不是f(x)。 這是因?yàn)樵谲嚨乐?#xff0c;對(duì)于任何給定的x可能有多個(gè)y值。f(y)的一階和二階導(dǎo)數(shù)低于:
產(chǎn)生的形式將在下面的函數(shù)中使用:
確定車輛在車道上的位置
了解車輛相對(duì)于車道的位置也很重要。 對(duì)于此項(xiàng)目,我們假設(shè)攝像機(jī)安裝在汽車的中央。
圖像處理管道
我們已經(jīng)構(gòu)建了管道的所有組件。 現(xiàn)在,我們需要將它們組合成一個(gè)可以在視頻鏡頭上運(yùn)行的管道。 我們將創(chuàng)建一個(gè)框架類來(lái)跟蹤不同的屬性。 稍后,當(dāng)我們想要平滑視頻處理時(shí),這將非常有用,就像在第一個(gè)項(xiàng)目中一樣。
夜間版: 在馬路上尋找車道線并跟蹤
配置環(huán)境
conda create -n env_lane python=3.6
conda activate env_lane
pip install opencv-contrib-python==3.4.9.31 -i Simple Index
pip install matplotlib -i Simple Index
pip install sklearn -i https://mirrors.aliyun.com/pypi/simple/
pip install jupyter -i Simple Index
使用卡爾曼濾波器在夜間環(huán)境中進(jìn)行車道檢測(cè)
自動(dòng)駕駛計(jì)算機(jī)視覺(jué)技術(shù)的一個(gè)重要里程碑是在道路上尋找車道標(biāo)記。在這里,我們描述了在夜間環(huán)境中檢測(cè)車道的過(guò)程。
挑戰(zhàn)性
·低光強(qiáng)度·難以調(diào)整各種光強(qiáng)度的參數(shù)·邊緣檢測(cè)不良·陰影,突然的高強(qiáng)度汽車大燈
我們的方法,這些步驟中描述了我們的方法:
1) 我們對(duì)每個(gè)視頻幀執(zhí)行伽瑪校正,以設(shè)置光強(qiáng)度
2) 從圖像中裁剪出“感興趣的區(qū)域”,因此我們只能在ROI部分上查找泳道。它有助于降低計(jì)算成本并提高fps。
3) 應(yīng)用雙邊濾波器消除噪聲并平滑視頻幀,但保留邊緣。
4) 應(yīng)用HSV濾鏡為固定范圍內(nèi)的像素創(chuàng)建蒙版
5) 經(jīng)過(guò)這些預(yù)處理(伽瑪校正和濾波)后,我們使用Canny邊緣檢測(cè)器檢測(cè)邊緣。
6) 之后,霍夫變換用于使用上一步中的邊緣檢測(cè)線。
7) 使用DBSCAN對(duì)檢測(cè)到的行進(jìn)行聚類,因?yàn)槲覀冎幌M缤ǖ赖男小?/p>
8) 卡爾曼濾波用于更好的車道檢測(cè)。在這里,我們?yōu)檐嚨赖木奂€應(yīng)用了線性估計(jì)器,以使其穩(wěn)定且沒(méi)有任何偏移誤差。
伽瑪校正
此處,伽瑪校正用于設(shè)置強(qiáng)度值。它使用參數(shù)對(duì)其進(jìn)行調(diào)整,還可以設(shè)置強(qiáng)度級(jí)別。伽瑪校正的基本知識(shí)在這里。
代碼:-def gamma_correction(RGBimage,Correct_param = 0.35,equalizeHist = False):紅色= RGBimage [:,:,2]綠色= RGBimage [:,:,1]藍(lán)色= RGBimage [:,:,0]
感興趣區(qū)域
使用以下代碼裁剪每個(gè)視頻幀,以僅考慮車道檢測(cè)部分。因此,可以避免由于路燈和其他汽車前照燈而突然出現(xiàn)的高照度。這也會(huì)稍微提高fps。
代碼:-def region_of_interest(img,vertices):#定義一個(gè)與圖像高度/寬度匹配的空白矩陣。mask = np.zeros_like(img)#檢索圖像的顏色通道數(shù)。#channel_count = img.shape [2]#用于填充多邊形的顏色match_mask_color = 255#用白色cv2.fillPoly(mask,vertices,(255,255,255))填充多邊形#僅在蒙版像素匹配masked_image = cv2.bitwise_and的情況下返回圖像(img,mask)返回masked_image
雙邊過(guò)濾器
雙邊濾波器是用于圖像的非線性,邊緣保留和降噪平滑濾波器。它將每個(gè)像素的強(qiáng)度替換為附近像素的強(qiáng)度值的加權(quán)平均值。
霍夫變換
在本節(jié)中,我們使用了霍夫變換和一些修改,以刪除水平檢測(cè)到的線和僅面向車道的線。代碼:def hough_transform(原始,gray_img,閾值,discard_horizontal = 0.4):“”“函數(shù)擬合線相交> =閾值白色像素的函數(shù)輸入:-原始-我們要在其上畫(huà)線的圖像-gray_img-白/黑圖像像素,例如Canny Edge Detection的結(jié)果-閾值-如果一條線相交超過(guò)閾值白色像素,則將其畫(huà)出-throws_horizontal-我們要考慮的線的最小abs導(dǎo)數(shù)返回:-image_lines-應(yīng)用函數(shù)的結(jié)果- lines_ok-rho和theta“”“線= cv2.HoughLines(gray_img,0.5,np.pi / 360)。
卡爾曼濾波器卡爾曼濾波器是一種算法,該算法使用一段時(shí)間內(nèi)對(duì)系統(tǒng)的嘈雜觀測(cè)值來(lái)估計(jì)系統(tǒng)參數(shù)(其中一些是不可觀察的)并預(yù)測(cè)未來(lái)的觀測(cè)值。它會(huì)在每個(gè)時(shí)間步進(jìn)行預(yù)測(cè),進(jìn)行測(cè)量并根據(jù)預(yù)測(cè)和測(cè)量的比較方式進(jìn)行自我更新。
在這里,LaneTracker類實(shí)現(xiàn)用于車道檢測(cè)的卡爾曼濾波器。首先,它初始化狀態(tài)矩陣和測(cè)量矩陣的大小。然后,它計(jì)算了轉(zhuǎn)移矩陣。我們將白高斯噪聲用于我們的系統(tǒng)。使用此噪聲模型,我們已經(jīng)計(jì)算了狀態(tài)誤差,并在估算器中使用該測(cè)量噪聲生成了預(yù)測(cè)狀態(tài)。卡爾曼濾波器通過(guò)將測(cè)量誤差和先前狀態(tài)相加來(lái)平均沿車道檢測(cè)到的線的變化。這就是為什么檢測(cè)到的車道標(biāo)記線隨時(shí)間推移保持穩(wěn)定的原因,并且由于其在以前的狀態(tài)下仍具有預(yù)測(cè)特性,因此在非常低的光照條件下,它可以通過(guò)記住先前視頻幀中的先前檢測(cè)到的車道來(lái)檢測(cè)車道。代碼:類LaneTracker:def init(self,n_lanes,proc_noise_scale,meas_noise_scale,process_cov_parallel = 0,proc_noise_type ='white'):self.n_lanes = n_lanes self.meas_size = 4 * self.n_lanes self.state_size = self.meas_size * 2 self.contr_size = 0
結(jié)論:
對(duì)于我們的數(shù)據(jù)集,該算法執(zhí)行得很好。對(duì)于非常低強(qiáng)度的燈光,它可以使用卡爾曼濾波器檢測(cè)車道。檢測(cè)到的車道標(biāo)記非常穩(wěn)定,對(duì)強(qiáng)度和噪聲變化具有魯棒性。
最后,歡迎大家通過(guò)微信公眾號(hào)聯(lián)系我們。
總結(jié)
以上是生活随笔為你收集整理的基于Python的复杂环境中车道线自动检测系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 罗克韦尔
- 下一篇: 网页中使用的特殊字体(webdings,