日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

基于Python的复杂环境中车道线自动检测系统

發(fā)布時(shí)間:2023/12/20 windows 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Python的复杂环境中车道线自动检测系统 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正常版:在馬路上尋找車(chē)道線(xiàn)

在這個(gè)項(xiàng)目中,本文建立了一個(gè)計(jì)算機(jī)視覺(jué)算法,用于檢測(cè)車(chē)道線(xiàn)并創(chuàng)建平均和外推的邊界線(xiàn)。 流程如下:

1)將幀轉(zhuǎn)換為灰度;

2)為黃色和白色像素創(chuàng)建蒙版;

3)應(yīng)用高斯平滑;

4)應(yīng)用Canny邊緣檢測(cè);

5)創(chuàng)建一個(gè)額外的遮罩,以專(zhuān)注于車(chē)輛前方的“感興趣區(qū)域”;

6)將XY空間中的點(diǎn)(即像素)轉(zhuǎn)換為霍夫空間中的線(xiàn);

7)霍夫空間中的線(xiàn)相交(即點(diǎn))的地方,XY空間中存在一條線(xiàn);

8)使用生成的線(xiàn)的極值,創(chuàng)建兩條平均線(xiàn)s;

9)在整個(gè)幀中創(chuàng)建兩條平均線(xiàn),以實(shí)現(xiàn)流暢的視頻播放;10)在每幀上畫(huà)線(xiàn)。

從霍夫空間轉(zhuǎn)換后的原始線(xiàn)

可流暢播放的平均線(xiàn)

工作流程:

1)檢查霍夫返回的每條線(xiàn),并根據(jù)其坡度確定是在左車(chē)道還是右車(chē)道。因?yàn)槲覀冋趯?duì)陣列進(jìn)行“上下顛倒”,所以左側(cè)車(chē)道的斜率為負(fù),右側(cè)車(chē)道的正值為;2)極值;3)計(jì)算平均值;4)解決b截距;5)用極值求積分;6)流暢的幀和緩存。

從霍夫空間轉(zhuǎn)換后的原始視頻

可流暢播放的車(chē)道線(xiàn)視頻

困難版: 這篇文檔為自動(dòng)駕駛汽車(chē)的車(chē)道線(xiàn)檢測(cè)和跟蹤提供了強(qiáng)大的解決方案。

步驟如下所示:

1)相機(jī)校準(zhǔn);2)失真校正;3)漸變和顏色閾值;4)透視變換;5)車(chē)道線(xiàn)搜索和搜索優(yōu)化;6)繪制車(chē)道覆蓋。

相機(jī)校準(zhǔn)

我們需要在棋盤(pá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è)和跟蹤車(chē)道線(xiàn)。

1)x和y方向的Sobel漸變;2)漸變幅度;3)漸變方向;4)色彩空間變換和過(guò)濾。

原始圖片

Sobel Gradients

Gradient Magnitude

Gradient Direction

飽和通道和紅色通道濾波器

首先,漸變?yōu)V鏡會(huì)將原始圖像轉(zhuǎn)換為灰度,并且丟失了許多有用的信息。車(chē)道線(xiàn)可以是黃色或白色,我們可以利用它來(lái)嘗試定位和跟蹤它們。色相飽和度亮度色彩空間將有所幫助。特別是,HSL圖像的S通道保留了大量有關(guān)車(chē)道線(xiàn)的信息-尤其是在道路上有陰影時(shí)。RGB的紅色通道在創(chuàng)建車(chē)道線(xiàn)的二進(jìn)制圖像方面也做得很好。

HSL圖像

RGB圖像

組合過(guò)濾方法

現(xiàn)在,我們可以混合并匹配不同的過(guò)濾器方法,每種方法都具有唯一的閾值,以獲取精確的二進(jìn)制圖像。

我測(cè)試了許多不同過(guò)濾器的許多按位組合。他們對(duì)于圖像整體都產(chǎn)生了不同的結(jié)果,但是這種組合在保留黃色車(chē)道線(xiàn)的信息方面做得最好,尤其是當(dāng)距離越來(lái)越遠(yuǎn)且在陰影下時(shí)。我將所有其他濾鏡都留在了里面,因?yàn)樗鼈冊(cè)诓煌墓庹諚l件下可能會(huì)有用。 需要更多測(cè)試圖像-尤其是夜間圖像!

看起來(lái)還不錯(cuò)! 它并沒(méi)有像我想要的那樣捕捉到遠(yuǎn)處的黃色車(chē)道線(xiàn)。它顯然會(huì)在樹(shù)投射的陰影下丟失該信息。

得到一個(gè)不變形的行車(chē)記錄儀框架

我們可以在此處看到,當(dāng)陰影距離相機(jī)更近/更大時(shí),管道在解決陰影下的線(xiàn)條方面做得更好。 但是,它仍然不完美。

透視變換

檢測(cè)車(chē)道線(xiàn)

現(xiàn)在,我們對(duì)道路的快照已完成轉(zhuǎn)換,我們準(zhǔn)備查找并跟蹤實(shí)際的車(chē)道。 為此,我們可以識(shí)別出大量白色像素區(qū)域。 具體來(lái)說(shuō),我們將使用直方圖將像素分為幾列,并尋找分布中的峰值。

我們可以清楚地看到該直方圖中的車(chē)道。 通過(guò)設(shè)置滑動(dòng)窗口,我們可以跟蹤由于道路略微彎曲而向左/向右轉(zhuǎn)向的峰。

下面的功能如下:

1)在圖像底部創(chuàng)建一個(gè)搜索窗口,其高度為圖像高度的1/9。

2)將窗口分為左右兩半。

3)通過(guò)直方圖找到具有最高值的像素列。

4)使用空白變量在該區(qū)域周?chē)L制一個(gè)框。

5)確定該框中的所有非零像素。如果有足夠的余量,請(qǐng)?jiān)谙乱粋€(gè)窗口平均位置上將框居中。

6)將二次方程式擬合到圖像每一半(左車(chē)道和右車(chē)道)中標(biāo)識(shí)的所有非零像素。

現(xiàn)在,我們已經(jīng)找到了車(chē)道,我們可以?xún)?yōu)化搜索區(qū)域,以加快流程。

下面的功能如下:

1)?導(dǎo)入多項(xiàng)式。2)在像素邊界內(nèi)查找非零像素)3.擬合更新多項(xiàng)式以擬合新數(shù)據(jù)。

在原始圖像上繪制車(chē)道

現(xiàn)在我們知道通道在哪里,我們可以將其輸出到實(shí)際的視頻提要。 我們將按照以下步驟進(jìn)行操作:

1)導(dǎo)入多項(xiàng)式;2)在變形后的二進(jìn)制文件的空白副本上繪制多項(xiàng)式曲線(xiàn);3)填充曲線(xiàn)之間的多邊形;4)使用反透視變換取消扭曲新圖像;5)將車(chē)道圖像疊加在原始幀的頂部。

確定車(chē)道曲率

現(xiàn)在我們有了車(chē)道,我們將要計(jì)算曲率半徑(即,道路彎曲了多少)。 當(dāng)我們需要?jiǎng)?chuàng)建用于控制汽車(chē)轉(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)樵谲?chē)道中,對(duì)于任何給定的x可能有多個(gè)y值。f(y)的一階和二階導(dǎo)數(shù)低于:

產(chǎn)生的形式將在下面的函數(shù)中使用:

確定車(chē)輛在車(chē)道上的位置

了解車(chē)輛相對(duì)于車(chē)道的位置也很重要。 對(duì)于此項(xiàng)目,我們假設(shè)攝像機(jī)安裝在汽車(chē)的中央。

圖像處理管道

我們已經(jīng)構(gòu)建了管道的所有組件。 現(xiàn)在,我們需要將它們組合成一個(gè)可以在視頻鏡頭上運(yùn)行的管道。 我們將創(chuàng)建一個(gè)框架類(lèi)來(lái)跟蹤不同的屬性。 稍后,當(dāng)我們想要平滑視頻處理時(shí),這將非常有用,就像在第一個(gè)項(xiàng)目中一樣。

夜間版: 在馬路上尋找車(chē)道線(xiàn)并跟蹤

配置環(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)行車(chē)道檢測(cè)

自動(dòng)駕駛計(jì)算機(jī)視覺(jué)技術(shù)的一個(gè)重要里程碑是在道路上尋找車(chē)道標(biāo)記。在這里,我們描述了在夜間環(huán)境中檢測(cè)車(chē)道的過(guò)程。

挑戰(zhàn)性

·低光強(qiáng)度·難以調(diào)整各種光強(qiáng)度的參數(shù)·邊緣檢測(cè)不良·陰影,突然的高強(qiáng)度汽車(chē)大燈

我們的方法,這些步驟中描述了我們的方法:

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è)線(xiàn)。

7) 使用DBSCAN對(duì)檢測(cè)到的行進(jìn)行聚類(lèi),因?yàn)槲覀冎幌M缤ǖ赖男小?/p>

8) 卡爾曼濾波用于更好的車(chē)道檢測(cè)。在這里,我們?yōu)檐?chē)道的聚集線(xiàn)應(yīng)用了線(xiàn)性估計(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è)視頻幀,以?xún)H考慮車(chē)道檢測(cè)部分。因此,可以避免由于路燈和其他汽車(chē)前照燈而突然出現(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ò)濾器

雙邊濾波器是用于圖像的非線(xiàn)性,邊緣保留和降噪平滑濾波器。它將每個(gè)像素的強(qiáng)度替換為附近像素的強(qiáng)度值的加權(quán)平均值。

霍夫變換

在本節(jié)中,我們使用了霍夫變換和一些修改,以刪除水平檢測(cè)到的線(xiàn)和僅面向車(chē)道的線(xiàn)。代碼:def hough_transform(原始,gray_img,閾值,discard_horizontal = 0.4):“”“函數(shù)擬合線(xiàn)相交> =閾值白色像素的函數(shù)輸入:-原始-我們要在其上畫(huà)線(xiàn)的圖像-gray_img-白/黑圖像像素,例如Canny Edge Detection的結(jié)果-閾值-如果一條線(xiàn)相交超過(guò)閾值白色像素,則將其畫(huà)出-throws_horizontal-我們要考慮的線(xiàn)的最小abs導(dǎo)數(shù)返回:-image_lines-應(yīng)用函數(shù)的結(jié)果- lines_ok-rho和theta“”“線(xiàn)= cv2.HoughLines(gray_img,0.5,np.pi / 360)。

卡爾曼濾波器卡爾曼濾波器是一種算法,該算法使用一段時(shí)間內(nèi)對(duì)系統(tǒng)的嘈雜觀(guān)測(cè)值來(lái)估計(jì)系統(tǒng)參數(shù)(其中一些是不可觀(guān)察的)并預(yù)測(cè)未來(lái)的觀(guān)測(cè)值。它會(huì)在每個(gè)時(shí)間步進(jìn)行預(yù)測(cè),進(jìn)行測(cè)量并根據(jù)預(yù)測(cè)和測(cè)量的比較方式進(jìn)行自我更新。

在這里,LaneTracker類(lèi)實(shí)現(xiàn)用于車(chē)道檢測(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)平均沿車(chē)道檢測(cè)到的線(xiàn)的變化。這就是為什么檢測(cè)到的車(chē)道標(biāo)記線(xiàn)隨時(shí)間推移保持穩(wěn)定的原因,并且由于其在以前的狀態(tài)下仍具有預(yù)測(cè)特性,因此在非常低的光照條件下,它可以通過(guò)記住先前視頻幀中的先前檢測(cè)到的車(chē)道來(lái)檢測(cè)車(chē)道。代碼:類(lèi)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è)車(chē)道。檢測(cè)到的車(chē)道標(biāo)記非常穩(wěn)定,對(duì)強(qiáng)度和噪聲變化具有魯棒性。

最后,歡迎大家通過(guò)微信公眾號(hào)聯(lián)系我們。

總結(jié)

以上是生活随笔為你收集整理的基于Python的复杂环境中车道线自动检测系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。