您好,登錄后才能下訂單哦!
如何使用OpenCV實現車道線檢測,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
幾乎所有攝像機使用的鏡頭在聚焦光線以捕捉圖像時都存在一定的誤差,因為這些光線由于折射在鏡頭邊緣發生了彎曲。這種現象會導致圖像邊緣的扭曲。以下視頻用示例解釋了兩種主要的失真類型,強烈建議觀看。
假設我們現在了解什么是徑向失真,需要利用失真系數(k1、k2 和 k3)來校正徑向失真。calibrateCamera.py是攝像機校準程序,默認情況下不運行該程序。建議在生成目標上的特征點和圖像上的特征點的過程中至少使用20個棋盤圖像。Main中的calibrate()將在/data/calibration中查找圖像,但是我們也可以選擇其他目錄。
圖1 左圖:圖像失真;右:未失真的圖像
去除圖像失真的整個過程是相當有趣的,OpenCV有一個很好的教程,解釋了概念并舉出一些例子。
檢測車道的第一步是調整我們的視覺系統,以鳥瞰的角度來觀察前方的道路,這將有助于計算道路的曲率,因此將有助于我們預測未來幾百米的轉向角大小。自上而下視圖的另一個好處是,它解決了車道線相交的問題。實際上只要沿道路行駛,車道線就是平行線。
鳥瞰圖可以通過應用透視變換來實現,即將輸入圖像中車道區域四個點映射到所需點上,從而生成自頂向下的視圖。這些點是根據個案確定,決定因素主要是攝像頭在車輛中的位置及其視野。圖2中的圖片分別表示輸入和轉換后輸出圖像。
圖2 左圖:之前、右側:之后
現在車道線是平行的,下一步將它們從輸入圖像上分割出來。輸入圖像包含RGB3個通道,車道線為白色或黃色。基于這個假設,輸入圖像可以轉換為單個通道灰度圖像,從而消除我們不需要的通道。另一個要轉換為的顏色空間是HLS顏色空間,其中S通道可能會根據照明情況提供較好的結果。在以下示例中,將使用圖像閾值,因為在給定的輸入圖像中它可以正常工作。圖3在閾值處理后可視化輸出。
圖3 cv2.threshold(image, 220, 225, cv2.THRESH_BINARY)
下閾值(220)和上閾值(225)將根據輸入圖像手動調整。OpenCV有基于整體嵌套邊緣檢測的先進技術,而無需對閾值進行任何手動調整,但本文仍然使用的是簡單的閾值技術。
預處理輸入圖像后,將在圖像空間中確定并繪制車道。方法是在二進制圖像(閾值圖像)的下半部分繪制非零像素直方圖,以觀察模式:
圖4直方圖x=像素,y = 計數
由于像素值是二進制的,峰值代表大多數非零像素的位置,因此可以很好地指示車道線。直方圖中的x坐標用作搜索相應通道的起點。滑動窗口方法的概念將應用在這里,以下視頻說明了滑動窗口的概念,圖5中是結果。
圖5.滑動窗口的概念應用于圖 4 的結果。
滑動窗口有助于估計每個車道區域的中心,使用這些 x 和 y 像素定位函數search_around_poly()可以適合二階多項曲線。該函數適合 f(y)而不是 f(x),因為通道在圖像中是垂直的。圖6很好地說明了這一步。
圖6 在這些通道上檢測到二階多項形
下一步是計算曲率半徑,該半徑可以使用與曲線局部部分附近的點緊密擬合的圓進行計算,如圖 7 所示。曲線在特定點的曲率半徑可以定義為近似圓的半徑。此半徑可以使用圖 7 中的公式計算。
圖7 曲率概念圖的半徑和用于計算 RoC 的方程
最后一步是在這些點之間放置一個多邊形,并將其投影回原始圖像,來突出顯示車道區域。曲率的車道面積和半徑是根據像素值計算的,像素值與真實世界空間不同,因此必須轉換為現實世界的值,這涉及到測量我們投射扭曲圖像的車道部分的長度和寬度。為簡單起見,我們可以假設大多數車道通常長 30 米,寬 3.7 米,并且代碼使用這些值將像素空間值轉換為實際儀表測量值。
圖 8 最終預期結果突出顯示車道區域
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。