一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用于無(wú)人駕駛技術(shù)中的車道線檢測(cè)技術(shù)

ml8z_IV_Technol ? 來(lái)源:cc ? 2019-01-23 10:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在本次分享中,我將以優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師學(xué)位中提供的高級(jí)車道線檢測(cè)項(xiàng)目為例,介紹普適性更好,且更為魯棒的車道線檢測(cè)技術(shù),用于處理那些無(wú)人駕駛中常見(jiàn)的(如路面顏色變化、路邊障礙物陰影等導(dǎo)致的)光線變化劇烈和彎道的場(chǎng)景。

按照慣例,在介紹計(jì)算機(jī)視覺(jué)技術(shù)前,我們先討論一下這次分享的輸入和輸出。

輸入

一個(gè)連續(xù)的視頻,視頻中的左車道線為黃色實(shí)線,右車道線為白色虛線。無(wú)人車會(huì)經(jīng)過(guò)路面顏色突變、路邊樹(shù)木影子干擾、車道線不清晰和急轉(zhuǎn)彎的路況。

輸出

左、右車道線的三次曲線方程,及其有效距離。最后將車道線圍成的區(qū)域顯示在圖像上,如下圖所示。

輸入和輸出都定義清楚后,我們開(kāi)始探討高級(jí)車道線檢測(cè)的算法,并對(duì)每幀視頻圖像中的車道線進(jìn)行檢測(cè)。

攝像機(jī)標(biāo)定

相信大家都多少聽(tīng)說(shuō)過(guò)魚(yú)眼相機(jī),最常見(jiàn)的魚(yú)眼相機(jī)是輔助駕駛員倒車的后向攝像頭。也有很多攝影愛(ài)好者會(huì)使用魚(yú)眼相機(jī)拍攝圖像,最終會(huì)有高大上的大片效果,如下圖所示。

圖片來(lái)源:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師課程

使用魚(yú)眼相機(jī)拍攝的圖像雖然高大上,但存在一個(gè)很大的問(wèn)題——畸變(Distortion)。如上圖所示,走道上的欄桿應(yīng)該是筆直延伸出去的。然而,欄桿在圖像上的成像卻是彎曲的,這就是圖像畸變,畸變會(huì)導(dǎo)致圖像失真。

使用車載攝像機(jī)拍攝出的圖像,雖然沒(méi)有魚(yú)眼相機(jī)的畸變這么夸張,但是畸變是客觀存在的,只是人眼難以察覺(jué)。使用有畸變的圖像做車道線的檢測(cè),檢測(cè)結(jié)果的精度將會(huì)受到影響,因此進(jìn)行圖像處理的第一步工作就是去畸變。

為了解決車載攝像機(jī)圖像的畸變問(wèn)題,攝像機(jī)標(biāo)定技術(shù)應(yīng)運(yùn)而生。

攝像機(jī)標(biāo)定是通過(guò)對(duì)已知的形狀進(jìn)行拍照,通過(guò)計(jì)算該形狀在真實(shí)世界中位置與在圖像中位置的偏差量(畸變系數(shù)),進(jìn)而用這個(gè)偏差量去修正其他畸變圖像的技術(shù)。

原則上,可以選用任何的已知形狀去校準(zhǔn)攝像機(jī),不過(guò)業(yè)內(nèi)的標(biāo)定方法都是基于棋盤(pán)格的。因?yàn)樗邆湟?guī)則的、高對(duì)比度圖案,能非常方便地自動(dòng)化檢測(cè)各個(gè)棋盤(pán)格的交點(diǎn),十分適合標(biāo)定攝像機(jī)的標(biāo)定工作。如下圖所示為標(biāo)準(zhǔn)的10x7(7行10列)的棋盤(pán)格。

OpenCV庫(kù)為攝像機(jī)標(biāo)定提供了函數(shù)cv2.findChessboardCorners(),它能自動(dòng)地檢測(cè)棋盤(pán)格內(nèi)4個(gè)棋盤(pán)格的交點(diǎn)(2白2黑的交接點(diǎn))。我們只需要輸入攝像機(jī)拍攝的完整棋盤(pán)格圖像和交點(diǎn)在橫縱向上的數(shù)量即可。隨后我們可以使用函數(shù)cv2.drawChessboardCorners()繪制出檢測(cè)的結(jié)果。

棋盤(pán)格原圖如下所示:

圖片出處:https://github.com/udacity/CarND-Advanced-Lane-Lines/blob/master/camera_cal/calibration2.jpg

使用OpenCV自動(dòng)交點(diǎn)檢測(cè)的結(jié)果如下:

獲取交點(diǎn)的檢測(cè)結(jié)果后,使用函數(shù)cv2.calibrateCamera()即可得到相機(jī)的畸變系數(shù)。

為了使攝像機(jī)標(biāo)定得到的畸變系數(shù)更加準(zhǔn)確,我們使用車載攝像機(jī)從不同的角度拍攝20張棋盤(pán)格,將所有的交點(diǎn)檢測(cè)結(jié)果保存,再進(jìn)行畸變系數(shù)的的計(jì)算。

我們將讀入圖片、預(yù)處理圖片、檢測(cè)交點(diǎn)、標(biāo)定相機(jī)的一系列操作,封裝成一個(gè)函數(shù),如下所示:

# Step 1 : Calculate camera distortion coefficientsdef getCameraCalibrationCoefficients(chessboardname, nx, ny): # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) objp = np.zeros((ny * nx, 3), np.float32) objp[:,:2] = np.mgrid[0:nx, 0:ny].T.reshape(-1,2) # Arrays to store object points and image points from all the images. objpoints = [] # 3d points in real world space imgpoints = [] # 2d points in image plane. images = glob.glob(chessboardname) if len(images) > 0: print("images num for calibration : ", len(images)) else: print("No image for calibration.") return ret_count = 0 for idx, fname in enumerate(images): img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_size = (img.shape[1], img.shape[0]) # Finde the chessboard corners ret, corners = cv2.findChessboardCorners(gray, (nx, ny), None) # If found, add object points, image points if ret == True: ret_count += 1 objpoints.append(objp) imgpoints.append(corners) ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size, None, None) print('Do calibration successfully') return ret, mtx, dist, rvecs, tvecs

需要標(biāo)定的一系列圖片如下圖所示:

圖片出處:https://github.com/udacity/CarND-Advanced-Lane-Lines/tree/master/camera_cal

調(diào)用之前封裝好的函數(shù),獲取畸變參數(shù)。

nx = 9 ny = 6 ret, mtx, dist, rvecs, tvecs = getCameraCalibrationCoefficients('camera_cal/calibration*.jpg', nx, ny)

隨后,使用OpenCV提供的函數(shù)cv2.undistort(),傳入剛剛計(jì)算得到的畸變參數(shù),即可將畸變的圖像進(jìn)行畸變修正處理。

# Step 2 : Undistort image def undistortImage(distortImage, mtx, dist): return cv2.undistort(distortImage, mtx, dist, None, mtx)

以畸變的棋盤(pán)格圖像為例,進(jìn)行畸變修正處理

# Read distorted chessboard image test_distort_image = cv2.imread('./camera_cal/calibration4.jpg') # Do undistortion test_undistort_image = undistortImage(test_distort_image, mtx, dist)

畸變圖像如下圖所示:

圖像出處:https://github.com/udacity/CarND-Advanced-Lane-Lines/blob/master/camera_cal/calibration4.jpg

復(fù)原后的圖像如下圖所示:

同理,我們將攝像機(jī)拍攝到的實(shí)際路況進(jìn)行畸變修正處理。

test_distort_image = cv2.imread('test_images/straight_lines1.jpg') # Do undistortion test_undistort_image = undistortImage(test_distort_image, mtx, dist)

原始畸變圖像如下所示:

圖片出處:https://github.com/udacity/CarND-Advanced-Lane-Lines/blob/master/test_images/straight_lines1.jpg

畸變修正后的圖像如下所示:

可以看到離鏡頭更近的左側(cè)、右側(cè)和下側(cè)的圖像比遠(yuǎn)處的畸變修正更明顯。

篩選圖像

從我們作為輸入的視頻可以看出,車輛會(huì)經(jīng)歷顛簸、車道線不清晰、路面顏色突變,路邊障礙物陰影干擾等復(fù)雜工況。因此,需要將這些復(fù)雜的場(chǎng)景篩選出來(lái),確保后續(xù)的算法能夠在這些復(fù)雜場(chǎng)景中正確地檢測(cè)出車道線。

使用以下代碼將視頻中的圖像數(shù)據(jù)提取,進(jìn)行畸變修正處理后,存儲(chǔ)在名為original_image的文件夾中,以供挑選。

video_input = 'project_video.mp4' cap = cv2.VideoCapture(video_input) count = 1 while(True): ret, image = cap.read() if ret: undistort_image = undistortImage(image, mtx, dist) cv2.imwrite('original_image/' + str(count) + '.jpg', undistort_image) count += 1 else: break cap.release()

在original_image文件夾中,挑選出以下6個(gè)場(chǎng)景進(jìn)行檢測(cè)。這6個(gè)場(chǎng)景既包含了視頻中常見(jiàn)的正常直道、正常彎道工況,也包含了具有挑戰(zhàn)性的陰影、明暗劇烈變化的工況。如下圖所示:

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

如果后續(xù)的高級(jí)車道線檢測(cè)算法能夠完美處理以上六種工況,那將算法應(yīng)用到視頻中,也會(huì)得到完美的車道線檢測(cè)效果。

透視變換

在完成圖像的畸變修正后,就要將注意力轉(zhuǎn)移到車道線。與《無(wú)人駕駛技術(shù)入門(mén)(十四)| 初識(shí)圖像之初級(jí)車道線檢測(cè)》中技術(shù)類似,這里需要定義一個(gè)感興趣區(qū)域。很顯然,我們的感興趣區(qū)域就是車輛正前方的這個(gè)車道。為了獲取感興趣區(qū)域,我們需要對(duì)自車正前方的道路使用一種叫做透視變換的技術(shù)。

“透視”是圖像成像時(shí),物體距離攝像機(jī)越遠(yuǎn),看起來(lái)越小的一種現(xiàn)象。在真實(shí)世界中,左右互相平行的車道線,會(huì)在圖像的最遠(yuǎn)處交匯成一個(gè)點(diǎn)。這個(gè)現(xiàn)象就是“透視成像”的原理造成的。

以立在路邊的交通標(biāo)志牌為例,它在攝像機(jī)所拍攝的圖像中的成像結(jié)果一般如下下圖所示:

圖片來(lái)源:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師課程

在這幅圖像上,原本應(yīng)該是正八邊形的標(biāo)志牌,成像成為一個(gè)不規(guī)則的八邊形。

通過(guò)使用透視變換技術(shù),可以將不規(guī)則的八邊形投影成規(guī)則的正八邊形。應(yīng)用透視變換后的結(jié)果對(duì)比如吐下:

圖片來(lái)源:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師課程

透視變換的原理:首先新建一幅跟左圖同樣大小的右圖,隨后在做圖中選擇標(biāo)志牌位于兩側(cè)的四個(gè)點(diǎn)(如圖中的紅點(diǎn)),記錄這4個(gè)點(diǎn)的坐標(biāo),我們稱這4個(gè)點(diǎn)為src_points。圖中的4個(gè)點(diǎn)組成的是一個(gè)平行四邊形。

由先驗(yàn)知識(shí)可知,左圖中4個(gè)點(diǎn)所圍成的平行四邊形,在現(xiàn)實(shí)世界中是一個(gè)長(zhǎng)方形,因此在右邊的圖中,選擇一個(gè)合適的位置,選擇一個(gè)長(zhǎng)方形區(qū)域,這個(gè)長(zhǎng)方形的4個(gè)端點(diǎn)一一對(duì)應(yīng)著原圖中的src_points,我們稱新的這4個(gè)點(diǎn)為dst_points。

得到src_points,dst_points后,我們就可以使用OpenCV中計(jì)算投影矩陣的函數(shù)cv2.getPerspectiveTransform(src_points, dst_points)算出src_points到dst_points的投影矩陣和投影變換后的圖像了。

使用OpenCV庫(kù)實(shí)現(xiàn)透視變換的代碼如下:

# Step 3 : Warp image based on src_points and dst_points # The type of src_points & dst_points should be like # np.float32([ [0,0], [100,200], [200, 300], [300,400]]) def warpImage(image, src_points, dst_points): image_size = (image.shape[1], image.shape[0]) # rows = img.shape[0] 720 # cols = img.shape[1] 1280 M = cv2.getPerspectiveTransform(src, dst) Minv = cv2.getPerspectiveTransform(dst, src) warped_image = cv2.warpPerspective(image, M,image_size, flags=cv2.INTER_LINEAR) return warped_image, M, Minv

同理,對(duì)于畸變修正過(guò)的道路圖像,我們同樣使用相同的方法,將我們感興趣的區(qū)域做透視變換。

如下圖所示,我們選用一張?jiān)谥本€道路上行駛的圖像,沿著左右車道線的邊緣,選擇一個(gè)梯形區(qū)域,這個(gè)區(qū)域在真實(shí)的道路中應(yīng)該是一個(gè)長(zhǎng)方形,因此我們選擇將這個(gè)梯形區(qū)域投影成為一個(gè)長(zhǎng)方形,在右圖橫坐標(biāo)的合適位置設(shè)置長(zhǎng)方形的4個(gè)端點(diǎn)。最終的投影結(jié)果就像“鳥(niǎo)瞰圖”一樣。

圖片出處:https://github.com/udacity/CarND-Advanced-Lane-Lines/tree/master/examples/warped_straight_lines.jpg

使用以下代碼,通過(guò)不斷調(diào)整src和dst的值,確保在直線道路上,能夠調(diào)試出滿意的透視變換圖像。

test_distort_image = cv2.imread('test_images/test4.jpg')# 畸變修正test_undistort_image = undistortImage(test_distort_image, mtx, dist)# 左圖梯形區(qū)域的四個(gè)端點(diǎn)src = np.float32([[580, 460], [700, 460], [1096, 720], [200, 720]])# 右圖矩形區(qū)域的四個(gè)端點(diǎn)dst = np.float32([[300, 0], [950, 0], [950, 720], [300, 720])test_warp_image, M, Minv = warpImage(test_undistort_image, src, dst)

最終,我們把篩選出的6幅圖統(tǒng)一應(yīng)用調(diào)整好的src、dst做透視變換,結(jié)果如下:

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

可以看到,越靠圖片下方的圖像越清晰,越上方的圖像越模糊。這是因?yàn)樵竭h(yuǎn)的地方,左圖中的像素點(diǎn)越少。而無(wú)論是遠(yuǎn)處還是近處,需要在右圖中填充的像素點(diǎn)數(shù)量是一樣的。左圖近處有足夠多的點(diǎn)去填充右圖,而左圖遠(yuǎn)處的點(diǎn)有限,只能通過(guò)插值的方式創(chuàng)造“假的”像素點(diǎn)進(jìn)行填充,所以就不那么清晰了。

提取車道線

在《無(wú)人駕駛技術(shù)入門(mén)(十四)| 初識(shí)圖像之初級(jí)車道線檢測(cè)》中,我們介紹了通過(guò)Canny邊緣提取算法獲取車道線待選點(diǎn)的方法,隨后使用霍夫直線變換進(jìn)行了車道線的檢測(cè)。在這里,我們也嘗試使用邊緣提取的方法進(jìn)行車道線提取。

需要注意的是,Canny邊緣提取算法會(huì)將圖像中各個(gè)方向、明暗交替位置的邊緣都提取出來(lái),很明顯,Canny邊緣提取算法在處理有樹(shù)木陰影的道路時(shí),會(huì)將樹(shù)木影子的輪廓也提取出來(lái),這是我們不愿意看到的。

因此我們選用Sobel邊緣提取算法。Sobel相比于Canny的優(yōu)秀之處在于,它可以選擇橫向或縱向的邊緣進(jìn)行提取。從投影變換后的圖像可以看出,我們關(guān)心的正是車道線在橫向上的邊緣突變。

封裝一下OpenCV提供的cv2.Sobel()函數(shù),將進(jìn)行邊緣提取后的圖像做二進(jìn)制圖的轉(zhuǎn)化,即提取到邊緣的像素點(diǎn)顯示為白色(值為1),未提取到邊緣的像素點(diǎn)顯示為黑色(值為0)。

def absSobelThreshold(img, orient='x', thresh_min=30, thresh_max=100): # Convert to grayscale gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # Apply x or y gradient with the OpenCV Sobel() function # and take the absolute value if orient == 'x': abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 1, 0)) if orient == 'y': abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 0, 1)) # Rescale back to 8 bit integer scaled_sobel = np.uint8(255*abs_sobel/np.max(abs_sobel)) # Create a copy and apply the threshold binary_output = np.zeros_like(scaled_sobel) # Here I'm using inclusive (>=, <=) thresholds, but exclusive is ok too ? ?binary_output[(scaled_sobel >= thresh_min) & (scaled_sobel <= thresh_max)] = 1 ? ?# Return the result ? ?return binary_output

使用同一組閾值對(duì)以上6幅做過(guò)投影變換的圖像進(jìn)行x方向的邊緣提取,可以得到如下結(jié)果:

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

由以上結(jié)果可以看出,在明暗交替明顯的路面上,如圖1和圖2,橫向的Sobel邊緣提取算法在提取車道線的表現(xiàn)上還不錯(cuò)。不過(guò)一旦道路的明暗交替不那么明顯了,如圖3和圖4的白色路面區(qū)域,很難提取到有效的車道線待選點(diǎn)。當(dāng)面對(duì)有樹(shù)木陰影覆蓋的區(qū)域時(shí),如圖5和圖6,雖然能提取出車道線的大致輪廓,但會(huì)同時(shí)引入的噪聲,給后續(xù)處理帶來(lái)麻煩。

因此,橫向的Sobel邊緣提取算法,無(wú)法很好地處理路面陰影、明暗交替的道路工況。

無(wú)法使用邊緣提取的方法提取車道線后,我們開(kāi)始將顏色空間作為突破口。

在以上6個(gè)場(chǎng)景中,雖然路面明暗交替,而且偶爾會(huì)有陰影覆蓋,但黃色和白色的車道線是一直都存在的。因此,我們?nèi)绻軐D中的黃色和白色分割出來(lái),然后將兩種顏色組合在一幅圖上,就能夠得到一個(gè)比較好的處理結(jié)果。

一幅圖像除了用RGB(紅綠藍(lán))三個(gè)顏色通道表示以外,還可以使用HSL(H色相、S飽和度、L亮度)和Lab(L亮度、a紅綠通道、b藍(lán)黃)模型來(lái)描述圖像,三通道的值與實(shí)際的成像顏色如下圖所示。

圖片出處:https://blog.csdn.net/wsp_1138886114/article/details/80660014

我們可以根據(jù)HSL模型中的L(亮度)通道來(lái)分割出圖像中的白色車道線,同時(shí)可以根據(jù)Lab模型中的b(藍(lán)黃)通道來(lái)分割出圖像中的黃色車道線,再將兩次的分割結(jié)果,去合集,疊加到一幅圖上,就能得到兩條完整的車道線了。

使用OpenCV提供的cv2.cvtColor()接口,將RGB通道的圖,轉(zhuǎn)為HLS通道的圖,隨后對(duì)L通道進(jìn)行分割處理,提取圖像中白色的車道線。封裝成代碼如下:

def hlsLSelect(img, thresh=(220, 255)): hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS) l_channel = hls[:,:,1] l_channel = l_channel*(255/np.max(l_channel)) binary_output = np.zeros_like(l_channel) binary_output[(l_channel > thresh[0]) & (l_channel <= thresh[1])] = 1 ? ?return binary_output

使用同一組閾值對(duì)以上6種工況進(jìn)行處理,處理結(jié)果如下圖所示。

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

使用OpenCV提供的cv2.cvtColor()接口,將RGB通道的圖,轉(zhuǎn)為L(zhǎng)ab通道的圖,隨后對(duì)b通道進(jìn)行分割處理,提取圖像中黃色的車道線。封裝成代碼如下:

def labBSelect(img, thresh=(195, 255)): # 1) Convert to LAB color space lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab) lab_b = lab[:,:,2] # don't normalize if there are no yellows in the image if np.max(lab_b) > 100: lab_b = lab_b*(255/np.max(lab_b)) # 2) Apply a threshold to the L channel binary_output = np.zeros_like(lab_b) binary_output[((lab_b > thresh[0]) & (lab_b <= thresh[1]))] = 1 ? ?# 3) Return a binary image of threshold result ? ?return binary_output

使用同一組閾值對(duì)以上6種工況進(jìn)行處理,處理結(jié)果如下圖所示。

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

根據(jù)以上試驗(yàn)可知,L通道能夠較好地分割出圖像中的白色車道線,b通道能夠較好地分割出圖像中的黃色車道線。即使面對(duì)樹(shù)木陰影和路面顏色突變的場(chǎng)景,也能盡可能少地引入噪聲。

最后,我們使用以下代碼,將兩個(gè)通道分割的圖像合并

hlsL_binary = hlsLSelect(test_warp_image) labB_binary = labBSelect(test_warp_image) combined_binary = np.zeros_like(hlsL_binary) combined_binary[(hlsL_binary == 1) | (labB_binary == 1)] = 1

最終合并的效果如下圖所示:

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由亮到暗的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

以上僅僅是車道線提取的方法之一。除了可以通過(guò)HSL和Lab顏色通道,這種基于規(guī)則的方法,分割出車道線外,還可以使用基于深度學(xué)習(xí)的方法。它們目的都是為了能夠穩(wěn)定地將車道線從圖像中分割出來(lái)。

檢測(cè)車道線

在檢測(cè)車道線前,需要粗定位車道線的位置。為了方便理解,這里引入一個(gè)概念——直方圖。

以下面這幅包含噪點(diǎn)的圖像為例,進(jìn)行直方圖的介紹。

圖片出處:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師學(xué)位

我們知道,我們處理的圖像的分辨率為1280*720,即720行,1280列。如果我將每一列的白色的點(diǎn)數(shù)量進(jìn)行統(tǒng)計(jì),即可得到1280個(gè)值。將這1280個(gè)值繪制在一個(gè)坐標(biāo)系中,橫坐標(biāo)為1-1280,縱坐標(biāo)表示每列中白色點(diǎn)的數(shù)量,那么這幅圖就是“直方圖”,如下圖所示:

圖片出處:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師學(xué)位

將兩幅圖疊加,效果如下:

圖片出處:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師學(xué)位

找到直方圖左半邊最大值所對(duì)應(yīng)的列數(shù),即為左車道線所在的大致位置;找到直方圖右半邊最大值所對(duì)應(yīng)的列數(shù),即為右車道線所在的大致位置。

使用直方圖找左右車道線大致位置的代碼如下,其中l(wèi)eftx_base和rightx_base即為左右車道線所在列的大致位置。

# Take a histogram of the bottom half of the image histogram = np.sum(combined_binary[combined_binary.shape[0]//2:,:], axis=0) # Create an output image to draw on and visualize the result out_img = np.dstack((combined_binary, combined_binary, combined_binary)) # Find the peak of the left and right halves of the histogram # These will be the starting point for the left and right lines midpoint = np.int(histogram.shape[0]//2) leftx_base = np.argmax(histogram[:midpoint]) rightx_base = np.argmax(histogram[midpoint:]) + midpoint

確定了左右車道線的大致位置后,使用一種叫做“滑動(dòng)窗口”的技術(shù),在圖中對(duì)左右車道線的點(diǎn)進(jìn)行搜索。先看一個(gè)介紹"滑動(dòng)窗口"原理的視頻(視頻大小1.18M)。

滑動(dòng)窗口原理

首先根據(jù)前面介紹的直方圖方法,找到左右車道線的大致位置,將這兩個(gè)大致位置作為起始點(diǎn)。定義一個(gè)矩形區(qū)域,稱之為“窗口”(圖中棕色的部分),分別以兩個(gè)起始點(diǎn)作為窗口的下邊線中點(diǎn),存儲(chǔ)所有在方塊中的白色點(diǎn)的橫坐標(biāo)。

隨后對(duì)存儲(chǔ)的橫坐標(biāo)取均值,將該均值所在的列以及第一個(gè)”窗口“的上邊緣所在的位置,作為下一個(gè)“窗口”的下邊線中點(diǎn),繼續(xù)搜索。

以此往復(fù),直到把所有的行都搜索完畢

所有落在窗口(圖中棕色區(qū)域)中的白點(diǎn),即為左右車道線的待選點(diǎn),如下圖藍(lán)色和紅色所示。隨后將藍(lán)色點(diǎn)和紅色點(diǎn)做三次曲線擬合,即可得到車道線的曲線方程。

使用直方圖、滑動(dòng)窗口檢測(cè)車道線的代碼如下:

# Step 5 : Detect lane lines through moving window def find_lane_pixels(binary_warped, nwindows, margin, minpix): # Take a histogram of the bottom half of the image histogram = np.sum(binary_warped[binary_warped.shape[0]//2:,:], axis=0) # Create an output image to draw on and visualize the result out_img = np.dstack((binary_warped, binary_warped, binary_warped)) # Find the peak of the left and right halves of the histogram # These will be the starting point for the left and right lines midpoint = np.int(histogram.shape[0]//2) leftx_base = np.argmax(histogram[:midpoint]) rightx_base = np.argmax(histogram[midpoint:]) + midpoint # Set height of windows - based on nwindows above and image shape window_height = np.int(binary_warped.shape[0]//nwindows) # Identify the x and y positions of all nonzero pixels in the image nonzero = binary_warped.nonzero() nonzeroy = np.array(nonzero[0]) nonzerox = np.array(nonzero[1]) # Current positions to be updated later for each window in nwindows leftx_current = leftx_base rightx_current = rightx_base # Create empty lists to receive left and right lane pixel indices left_lane_inds = [] right_lane_inds = [] # Step through the windows one by one for window in range(nwindows): # Identify window boundaries in x and y (and right and left) win_y_low = binary_warped.shape[0] - (window+1)*window_height win_y_high = binary_warped.shape[0] - window*window_height win_xleft_low = leftx_current - margin win_xleft_high = leftx_current + margin win_xright_low = rightx_current - margin win_xright_high = rightx_current + margin # Draw the windows on the visualization image cv2.rectangle(out_img,(win_xleft_low,win_y_low), (win_xleft_high,win_y_high),(0,255,0), 2) cv2.rectangle(out_img,(win_xright_low,win_y_low), (win_xright_high,win_y_high),(0,255,0), 2) # Identify the nonzero pixels in x and y within the window # good_left_inds = ((nonzeroy >= win_y_low) & (nonzeroy < win_y_high) & ? ? ? ?(nonzerox >= win_xleft_low) & (nonzerox < win_xleft_high)).nonzero()[0] ? ? ? ?good_right_inds = ((nonzeroy >= win_y_low) & (nonzeroy < win_y_high) & ? ? ? ?(nonzerox >= win_xright_low) & (nonzerox < win_xright_high)).nonzero()[0] ? ? ? ? ? ? ? ?# Append these indices to the lists ? ? ? ?left_lane_inds.append(good_left_inds) ? ? ? ?right_lane_inds.append(good_right_inds) ? ? ? ? ? ? ? ?# If you found > minpix pixels, recenter next window on their mean position if len(good_left_inds) > minpix: leftx_current = np.int(np.mean(nonzerox[good_left_inds])) if len(good_right_inds) > minpix: rightx_current = np.int(np.mean(nonzerox[good_right_inds])) # Concatenate the arrays of indices (previously was a list of lists of pixels) try: left_lane_inds = np.concatenate(left_lane_inds) right_lane_inds = np.concatenate(right_lane_inds) except ValueError: # Avoids an error if the above is not implemented fully pass # Extract left and right line pixel positions leftx = nonzerox[left_lane_inds] lefty = nonzeroy[left_lane_inds] rightx = nonzerox[right_lane_inds] righty = nonzeroy[right_lane_inds] return leftx, lefty, rightx, righty, out_img def fit_polynomial(binary_warped, nwindows=9, margin=100, minpix=50): # Find our lane pixels first leftx, lefty, rightx, righty, out_img = find_lane_pixels( binary_warped, nwindows, margin, minpix) # Fit a second order polynomial to each using `np.polyfit` left_fit = np.polyfit(lefty, leftx, 2) right_fit = np.polyfit(righty, rightx, 2) # Generate x and y values for plotting ploty = np.linspace(0, binary_warped.shape[0]-1, binary_warped.shape[0] ) try: left_fitx = left_fit[0]*ploty**2 + left_fit[1]*ploty + left_fit[2] right_fitx = right_fit[0]*ploty**2 + right_fit[1]*ploty + right_fit[2] except TypeError: # Avoids an error if `left` and `right_fit` are still none or incorrect print('The function failed to fit a line!') left_fitx = 1*ploty**2 + 1*ploty right_fitx = 1*ploty**2 + 1*ploty ## Visualization ## # Colors in the left and right lane regions out_img[lefty, leftx] = [255, 0, 0] out_img[righty, rightx] = [0, 0, 255] # Plots the left and right polynomials on the lane lines #plt.plot(left_fitx, ploty, color='yellow') #plt.plot(right_fitx, ploty, color='yellow') return out_img, left_fit, right_fit, ploty

對(duì)以上6種工況進(jìn)行車道線檢測(cè),處理結(jié)果如下圖所示。

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

跟蹤車道線

視頻數(shù)據(jù)是連續(xù)的圖片,基于連續(xù)兩幀圖像中的車道線不會(huì)突變的先驗(yàn)知識(shí),我們可以使用上一幀檢測(cè)到的車道線結(jié)果,作為下一幀圖像處理的輸入,搜索上一幀車道線檢測(cè)結(jié)果附近的點(diǎn),這樣不僅可以減少計(jì)算量,而且得到的車道線結(jié)果也更穩(wěn)定,如下圖所示。

圖片出處:優(yōu)達(dá)學(xué)城(Udacity)無(wú)人駕駛工程師學(xué)位

圖中的細(xì)黃線為上一幀檢測(cè)到的車道線結(jié)果,綠色陰影區(qū)域?yàn)榧?xì)黃線橫向擴(kuò)展的一個(gè)區(qū)域,通過(guò)搜索該區(qū)域內(nèi)的白點(diǎn)坐標(biāo),即可快速確定當(dāng)前幀中左右車道線的待選點(diǎn)。

使用上一幀的車道線檢測(cè)結(jié)果進(jìn)行車道線跟蹤的代碼如下:

# Step 6 : Track lane lines based the latest lane line result def fit_poly(img_shape, leftx, lefty, rightx, righty): ### TO-DO: Fit a second order polynomial to each with np.polyfit() ### left_fit = np.polyfit(lefty, leftx, 2) right_fit = np.polyfit(righty, rightx, 2) # Generate x and y values for plotting ploty = np.linspace(0, img_shape[0]-1, img_shape[0]) ### TO-DO: Calc both polynomials using ploty, left_fit and right_fit ### left_fitx = left_fit[0]*ploty**2 + left_fit[1]*ploty + left_fit[2] right_fitx = right_fit[0]*ploty**2 + right_fit[1]*ploty + right_fit[2] return left_fitx, right_fitx, ploty, left_fit, right_fit def search_around_poly(binary_warped, left_fit, right_fit): # HYPERPARAMETER # Choose the width of the margin around the previous polynomial to search # The quiz grader expects 100 here, but feel free to tune on your own! margin = 60 # Grab activated pixels nonzero = binary_warped.nonzero() nonzeroy = np.array(nonzero[0]) nonzerox = np.array(nonzero[1]) ### TO-DO: Set the area of search based on activated x-values ### ### within the +/- margin of our polynomial function ### ### Hint: consider the window areas for the similarly named variables ### ### in the previous quiz, but change the windows to our new search area ### left_lane_inds = ((nonzerox > (left_fit[0]*(nonzeroy**2) + left_fit[1]*nonzeroy + left_fit[2] - margin)) & (nonzerox < (left_fit[0]*(nonzeroy**2) + ? ? ? ? ? ? ? ? ? ?left_fit[1]*nonzeroy + left_fit[2] + margin))) ? ?right_lane_inds = ((nonzerox > (right_fit[0]*(nonzeroy**2) + right_fit[1]*nonzeroy + right_fit[2] - margin)) & (nonzerox < (right_fit[0]*(nonzeroy**2) + ? ? ? ? ? ? ? ? ? ?right_fit[1]*nonzeroy + right_fit[2] + margin))) ? ? ? ?# Again, extract left and right line pixel positions ? ?leftx = nonzerox[left_lane_inds] ? ?lefty = nonzeroy[left_lane_inds] ? ?rightx = nonzerox[right_lane_inds] ? ?righty = nonzeroy[right_lane_inds] ? ?# Fit new polynomials ? ?left_fitx, right_fitx, ploty, left_fit, right_fit = fit_poly(binary_warped.shape, leftx, lefty, rightx, righty) ? ? ? ?## Visualization ## ? ?# Create an image to draw on and an image to show the selection window ? ?out_img = np.dstack((binary_warped, binary_warped, binary_warped))*255 ? ?window_img = np.zeros_like(out_img) ? ?# Color in left and right line pixels ? ?out_img[nonzeroy[left_lane_inds], nonzerox[left_lane_inds]] = [255, 0, 0] ? ?out_img[nonzeroy[right_lane_inds], nonzerox[right_lane_inds]] = [0, 0, 255] ? ?# Generate a polygon to illustrate the search window area ? ?# And recast the x and y points into usable format for cv2.fillPoly() ? ?left_line_window1 = np.array([np.transpose(np.vstack([left_fitx-margin, ploty]))]) ? ?left_line_window2 = np.array([np.flipud(np.transpose(np.vstack([left_fitx+margin, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ploty])))]) ? ?left_line_pts = np.hstack((left_line_window1, left_line_window2)) ? ?right_line_window1 = np.array([np.transpose(np.vstack([right_fitx-margin, ploty]))]) ? ?right_line_window2 = np.array([np.flipud(np.transpose(np.vstack([right_fitx+margin, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ploty])))]) ? ?right_line_pts = np.hstack((right_line_window1, right_line_window2)) ? ?# Draw the lane onto the warped blank image ? ?cv2.fillPoly(window_img, np.int_([left_line_pts]), (0,255, 0)) ? ?cv2.fillPoly(window_img, np.int_([right_line_pts]), (0,255, 0)) ? ?result = cv2.addWeighted(out_img, 1, window_img, 0.3, 0) ? ? ? ?# Plot the polynomial lines onto the image ? ?#plt.plot(left_fitx, ploty, color='yellow') ? ?#plt.plot(right_fitx, ploty, color='yellow') ? ?## End visualization steps ## ? ? ? ?return result, left_fit, right_fit, ploty

對(duì)以上6種工況進(jìn)行車道線跟蹤,處理結(jié)果如下圖所示。

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

以上,我們就完成了在透視變換結(jié)果上的車道線檢測(cè)和跟蹤。

逆投影到原圖

我們?cè)谟?jì)算透視變換矩陣時(shí)計(jì)算了兩個(gè)矩陣M和Minv,使用M能夠?qū)崿F(xiàn)透視變換,使用Minv能夠?qū)崿F(xiàn)逆透視變換。

M = cv2.getPerspectiveTransform(src, dst) Minv = cv2.getPerspectiveTransform(dst, src)

我們將兩條車道線所圍成的區(qū)域涂成綠色,并將結(jié)果繪制在“鳥(niǎo)瞰圖”上后,使用逆透視變換矩陣反投到原圖上,即可實(shí)現(xiàn)在原圖上的可視化效果。代碼如下:

# Step 7 : Draw lane line result on undistorted image def drawing(undist, bin_warped, color_warp, left_fitx, right_fitx): # Create an image to draw the lines on warp_zero = np.zeros_like(bin_warped).astype(np.uint8) color_warp = np.dstack((warp_zero, warp_zero, warp_zero)) # Recast the x and y points into usable format for cv2.fillPoly() pts_left = np.array([np.transpose(np.vstack([left_fitx, ploty]))]) pts_right = np.array([np.flipud(np.transpose(np.vstack([right_fitx, ploty])))]) pts = np.hstack((pts_left, pts_right)) # Draw the lane onto the warped blank image cv2.fillPoly(color_warp, np.int_([pts]), (0,255, 0)) # Warp the blank back to original image space using inverse perspective matrix (Minv) newwarp = cv2.warpPerspective(color_warp, Minv, (undist.shape[1], undist.shape[0])) # Combine the result with the original image result = cv2.addWeighted(undist, 1, newwarp, 0.3, 0) return result

以上6個(gè)場(chǎng)景的左右車道線繪制結(jié)果如下所示:

無(wú)陰影、顏色無(wú)明暗變換的直道

無(wú)陰影、顏色無(wú)明暗變換的彎道

有小面積陰影、顏色由暗到亮的直道

無(wú)陰影、道路標(biāo)志線不清晰的彎道

有大面積陰影、顏色由暗到亮的彎道

有大面積陰影、顏色由亮到暗的彎道

處理視頻

在一步步完成攝像機(jī)標(biāo)定、圖像畸變校正、透視變換、提取車道線、檢測(cè)車道線、跟蹤車道線后,我們?cè)趫D像上實(shí)現(xiàn)了復(fù)雜環(huán)境下的車道線檢測(cè)算法?,F(xiàn)在我們將視頻轉(zhuǎn)化為圖片,然后一幀幀地對(duì)視頻數(shù)據(jù)進(jìn)行處理,然后將車道線檢測(cè)結(jié)果存為另一段視頻。

高級(jí)車道線檢測(cè)算法效果

視頻中左上角出現(xiàn)的道路曲率和車道偏離量的計(jì)算都是獲取車道線曲線方程后的具體應(yīng)用,這里不做詳細(xì)討論。

結(jié)語(yǔ)

以上就是《再識(shí)圖像之高級(jí)車道線檢測(cè)》的全部?jī)?nèi)容,本次分享中介紹的攝像機(jī)標(biāo)定、投影變換、顏色通道、滑動(dòng)窗口等技術(shù),在計(jì)算機(jī)視覺(jué)領(lǐng)域均得到了廣泛應(yīng)用。

處理復(fù)雜道路場(chǎng)景下的視頻數(shù)據(jù)是一項(xiàng)及其艱巨的任務(wù)。僅以提取車道線的過(guò)程為例,使用設(shè)定規(guī)則的方式提取車道線,雖然能夠處理項(xiàng)目視頻中的場(chǎng)景,但面對(duì)變化更為惡劣的場(chǎng)景時(shí),還是無(wú)能為力?,F(xiàn)階段解決該問(wèn)題的方法就是通過(guò)深度學(xué)習(xí)的方法,拿足夠多的標(biāo)注數(shù)據(jù)去訓(xùn)練模型,才能盡可能多地達(dá)到穩(wěn)定的檢測(cè)效果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 無(wú)人駕駛
    +關(guān)注

    關(guān)注

    99

    文章

    4172

    瀏覽量

    123454

原文標(biāo)題:無(wú)人駕駛技術(shù)入門(mén) —— 再識(shí)圖像之高級(jí)車道線檢測(cè)

文章出處:【微信號(hào):IV_Technology,微信公眾號(hào):智車科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    低空物流:無(wú)人機(jī)開(kāi)啟未來(lái)配送新篇章

    ,解決“最后一公里”配送難題 02齊發(fā)力 中國(guó)在低空物流領(lǐng)域已走上快車道,政策、技術(shù)和企業(yè)三駕馬車齊發(fā)力: 政策加持:2023年《無(wú)人駕駛航空器飛行管理暫行條例》為低空物流松綁,深圳、上海、成都
    發(fā)表于 07-04 10:42

    什么是低速無(wú)人駕駛,讓你一分鐘秒懂 #無(wú)人駕駛 #5g無(wú)人駕駛 #低速無(wú)人駕駛

    無(wú)人駕駛
    星創(chuàng)易聯(lián)
    發(fā)布于 :2025年06月05日 15:27:49

    無(wú)人駕駛技術(shù)未來(lái)在哪里?低速才是突破口

    ? 無(wú)人駕駛技術(shù)這幾年從實(shí)驗(yàn)室迅速走向現(xiàn)實(shí)。在大眾印象,無(wú)人駕駛常被等同于在城市道路上自由穿梭的智能汽車,但實(shí)際率先實(shí)現(xiàn)商業(yè)化落地的,是低速無(wú)人駕
    的頭像 發(fā)表于 05-23 15:38 ?223次閱讀
    <b class='flag-5'>無(wú)人駕駛</b><b class='flag-5'>技術(shù)</b>未來(lái)在哪里?低速才是突破口

    易控智駕無(wú)人駕駛技術(shù)再次取得新突破

    近日,易控智駕無(wú)人駕駛技術(shù)再次取得新突破,“混編+混行”技術(shù)已在國(guó)內(nèi)多個(gè)礦區(qū)成功落地并常態(tài)化“下人”運(yùn)行,成為目前行業(yè)內(nèi)唯一實(shí)現(xiàn)無(wú)人礦卡與人工礦卡在“裝載區(qū)混裝+道路混行+卸載區(qū)混卸”
    的頭像 發(fā)表于 05-09 15:44 ?978次閱讀

    派歌銳無(wú)人駕駛車輛束:智能駕駛的神經(jīng)網(wǎng)絡(luò)

    派歌銳是專業(yè)的新能源束解決方案提供商,為無(wú)人駕駛車輛提供穩(wěn)定可靠的束解決方案
    的頭像 發(fā)表于 04-25 17:21 ?269次閱讀

    易控智駕發(fā)布礦山無(wú)人駕駛應(yīng)用落地成果

    近日,“易路相伴 智約共贏”無(wú)人駕駛礦用車規(guī)?;瘧?yīng)用成果發(fā)布會(huì)在三亞順利召開(kāi)。作為全球領(lǐng)先的礦山無(wú)人駕駛公司,易控智駕發(fā)布了礦山無(wú)人駕駛應(yīng)用落地成果,成為行業(yè)首個(gè)突破落地1000臺(tái)無(wú)人駕駛
    的頭像 發(fā)表于 03-04 11:25 ?586次閱讀

    為什么聊自動(dòng)駕駛的越來(lái)越多,聊無(wú)人駕駛的越來(lái)越少?

    無(wú)人駕駛”與“自動(dòng)駕駛”,傻傻分不清楚?就在之前的一篇文章,引用了王傳福的一句話,其說(shuō)的是無(wú)人駕駛是“扯淡”( 相關(guān)閱讀: 無(wú)人駕駛是“
    的頭像 發(fā)表于 02-23 10:52 ?546次閱讀
    為什么聊自動(dòng)<b class='flag-5'>駕駛</b>的越來(lái)越多,聊<b class='flag-5'>無(wú)人駕駛</b>的越來(lái)越少?

    易控智駕無(wú)人駕駛技術(shù)深度賦能首鋼集團(tuán)水廠鐵礦項(xiàng)目

    ?日前,易控智駕無(wú)人駕駛技術(shù)賦能的首鋼集團(tuán)水廠鐵礦項(xiàng)目順利通過(guò)客戶驗(yàn)收。該項(xiàng)目2024年11月便已滿足客戶要求的效率指標(biāo),并實(shí)現(xiàn)客戶獨(dú)立自主運(yùn)行。
    的頭像 發(fā)表于 02-19 09:31 ?584次閱讀

    魯渝能源無(wú)線充電技術(shù)在低速無(wú)人駕駛環(huán)衛(wèi)車的創(chuàng)新應(yīng)用

    低速無(wú)人駕駛環(huán)衛(wèi)車采用無(wú)線充電技術(shù)提升智能化與綠色化,面臨成本、效率、自由度與環(huán)境適應(yīng)性挑戰(zhàn)。青島魯渝能源創(chuàng)新技術(shù),實(shí)現(xiàn)高效充電、多車協(xié)同,為城市智能化和綠色化提供支持。
    的頭像 發(fā)表于 01-04 10:34 ?496次閱讀

    【實(shí)戰(zhàn)】Python+OpenCV車道檢測(cè)識(shí)別項(xiàng)目:實(shí)現(xiàn)L2級(jí)別自動(dòng)駕駛必備(配套課程+平臺(tái)實(shí)踐)

    的一個(gè)必備技能——車道檢測(cè)。本文將詳細(xì)介紹一個(gè)車道檢測(cè)項(xiàng)目的過(guò)程,從圖像采集到
    的頭像 發(fā)表于 12-16 15:42 ?1066次閱讀
    【實(shí)戰(zhàn)】Python+OpenCV<b class='flag-5'>車道</b><b class='flag-5'>線</b><b class='flag-5'>檢測(cè)</b>識(shí)別項(xiàng)目:實(shí)現(xiàn)L2級(jí)別自動(dòng)<b class='flag-5'>駕駛</b>必備(配套課程+平臺(tái)實(shí)踐)

    測(cè)速雷達(dá)與無(wú)人駕駛技術(shù)的結(jié)合 測(cè)速雷達(dá)故障排除技巧

    測(cè)速雷達(dá)與無(wú)人駕駛技術(shù)的結(jié)合 測(cè)速雷達(dá)作為無(wú)人駕駛汽車環(huán)境感知系統(tǒng)的核心技術(shù)之一,發(fā)揮著至關(guān)重要的作用。它通過(guò)發(fā)射無(wú)線電波并接收其反射信號(hào),能夠精確測(cè)量車輛的速度,并獲取周圍環(huán)境
    的頭像 發(fā)表于 12-05 17:18 ?1022次閱讀

    UWB模塊如何助力無(wú)人駕駛技術(shù)

    ,它使用超過(guò)500MHz的帶寬進(jìn)行數(shù)據(jù)傳輸。與傳統(tǒng)的窄帶通信技術(shù)相比,UWB技術(shù)具有以下特點(diǎn): 高精度定位 :UWB技術(shù)能夠提供厘米級(jí)的定位精度,這對(duì)于無(wú)人駕駛車輛在復(fù)雜環(huán)境
    的頭像 發(fā)表于 10-31 14:05 ?903次閱讀

    無(wú)線充電技術(shù)為低速無(wú)人駕駛清掃車注入無(wú)限動(dòng)力

    無(wú)人駕駛清掃機(jī)器人采用無(wú)線充電技術(shù),提高運(yùn)行效率、安全性和耐候性,降低維護(hù)成本。青島魯渝能源推出專為低速無(wú)人駕駛車設(shè)計(jì)的無(wú)線充電器,快速高效且安全,支持智能優(yōu)化充電,助力智慧城市發(fā)展。
    的頭像 發(fā)表于 10-25 10:53 ?669次閱讀

    MT6825磁編碼IC在無(wú)人駕駛電動(dòng)收割機(jī)的應(yīng)用

    隨著科技的飛速發(fā)展,無(wú)人駕駛技術(shù)正在逐漸滲透到各個(gè)行業(yè),其中農(nóng)業(yè)領(lǐng)域尤為引人注目。無(wú)人駕駛電動(dòng)收割機(jī)的出現(xiàn),不僅提高了農(nóng)業(yè)生產(chǎn)的效率,也降低了農(nóng)民的勞動(dòng)強(qiáng)度,使得農(nóng)業(yè)生產(chǎn)更加智能化、
    的頭像 發(fā)表于 07-25 16:47 ?705次閱讀

    5G賦能車聯(lián)網(wǎng),無(wú)人駕駛引領(lǐng)未來(lái)出行

    無(wú)人駕駛車聯(lián)網(wǎng)應(yīng)用已成為智能交通領(lǐng)域的重要發(fā)展趨勢(shì)。隨著無(wú)人駕駛技術(shù)的不斷進(jìn)步和5G網(wǎng)絡(luò)的廣泛部署,5G工業(yè)路由器在無(wú)人駕駛車聯(lián)網(wǎng)的應(yīng)用日
    的頭像 發(fā)表于 07-24 10:10 ?1188次閱讀
    5G賦能車聯(lián)網(wǎng),<b class='flag-5'>無(wú)人駕駛</b>引領(lǐng)未來(lái)出行