本博客使用的圖像是188*120的大津法二值化圖像。攝像頭安裝高度為25cm(離地),前瞻長度約1m。
智能車圖像處理的過程就是讀取輸入的圖像,經(jīng)過處理后向控制部分輸出一個偏差值,控制部分根據(jù)再這個偏差值輸出相應的控制量,對偏差進行修正,這就是最基本的循跡。
? 在得到二值化圖像后,我們?nèi)绾芜M行最基本的使用呢?
賽道邊界的簡單提取
? 二值化圖像中,在沒有反光、不均勻光照和場外雜物的影響時,賽道和藍布應當具有清晰的邊界。我使用的是二值化后的原始圖像,沒有進行圖像濾波等平滑毛刺處理,因為我在進行誤差計算的時候使用的是均值,這么做的好處是容許因邊界存在毛刺或者鋸齒造成的誤差而不會很大地影響最終計算的偏差值。誤差的具體計算方式后面再細講,這里先說邊界的尋找。一般情況下,循跡主要靠圖像遠端偏差進行誤差計算,這樣可以有提前量。賽道邊界不需要跟蹤到迂回彎道之后,跟蹤到迂回彎道之后不僅代碼編寫難度高很多,而且計算的偏差值意義不大。攝像頭的優(yōu)點是前瞻長,但是成也蕭何敗蕭何,前瞻過長也不是好事。賽道邊界需要分別保存在左右兩個數(shù)組中,這兩個數(shù)組最好是全局變量,以便后續(xù)循跡偏差計算和元素識別使用。
? 賽道邊界提取最簡單有效的辦法就是種子生長法。根據(jù)賽道近端一定是白色的特性(不是這樣的話車基本已經(jīng)出賽道了),首先找到圖像圖像最下方一行白色的中點,作為全圖搜索的seed
;接著從近到遠(也就是圖像中的從下到上)開始分別向左和向右搜索黑白交界點,找到黑白交界點就分別保存在左右邊線數(shù)組中,并且根據(jù)(左邊+右邊)/2
的方法計算該行中線橫坐標,保存至中線數(shù)組中,并且作為下一行的seed
,繼續(xù)如上過程,直至全圖搜索完畢。如果在該行某一側(cè)沒有搜索到邊界,則給該側(cè)邊界數(shù)組的該行對應元素存入0或者187,標示為丟邊。這樣,整個過程就像是中線的種子從圖像下方生長至圖像上方,所以我給它起名種子生長法。這么做的好處就是,可以實現(xiàn)直道以及非迂回彎道的簡單中線跟蹤,且由于種子是根據(jù)最下方一行的白色賽道中點確定的,在小彎中的表現(xiàn)更加穩(wěn)定,因為如果直接默認從最下方的一行中點作為seed
向上搜線的話,在小彎中車的視野中賽道很有可能只在圖像的一側(cè),一旦最下方的白色僅僅處于圖像中心的一側(cè),就會出現(xiàn)邊界掃描錯誤的情況,導致偏差計算出錯,車會直接往彎的反方向打舵機沖出賽道。而種子生長法就不會出現(xiàn)這樣的問題。
循跡偏差值的計算
? 關(guān)于循跡,其實有很多可以利用的參數(shù),也衍生出了很多方案,我也沒有接觸過那些高級的制導方法,只能簡單講一講自己接觸過的幾種方法了。
-
動態(tài)中線長度+每行平均偏差法
? 這里的“動態(tài)中線長度”指的是從下至上,中線的不截斷長度。這里的“截斷”,指的是手動設置一個截斷閾值,在掃描中線的時候,如果下一行與上一行的中線點像素橫坐標差值大于這個閾值,就認為中線發(fā)生了截斷,發(fā)生截斷后就停止向上搜索中線,并且記錄下已經(jīng)搜索到的中線長度,認為是“有效中線”。然后,就在這段“有效中線”內(nèi),每行與圖像中心坐標相減,再求取平均值,就得到了一個偏差值。之所以想到了這樣一個“動態(tài)中線長”的方法,是因為我考慮到近端圖像相較于遠端圖像更為穩(wěn)定,且在彎道處遠端沒有搜索到邊線的一段不應該納入計算。但是這種方法對于彎道和存在元素的地方適應性并不是很好,過彎軌跡并不是很理想,因為這種方法壓制了前瞻,在遠端出現(xiàn)變化需要做出響應時往往不能很及時地調(diào)整誤差。
-
動態(tài)中線長度+各行權(quán)值偏差法
? 這種方法是在第一種方法的基礎上,給每行都引入了一個偏差權(quán)值,這個偏差權(quán)值提前計算好存儲在一個數(shù)組內(nèi)(權(quán)值表)。在PID參數(shù)不變的情況下,調(diào)整這個權(quán)值表中各行的權(quán)值,可以微調(diào)過彎軌跡(算是變相起到了PID的作用hh)。當然,這個權(quán)值的計算也可以在寫程序的時候用一個函數(shù)計算,但我為了加快運算速度就把每行的權(quán)值打了一張表。這個表的獲取也可以用簡單的MATLAB程序?qū)崿F(xiàn)。測試當這個權(quán)值符合σ(0.5,1)時,效果較好(其實只要基本上符合中間大遠近小的規(guī)律就行了,這個測試的結(jié)果與我最后采用的一種方法得出的結(jié)果是一致的)。
-
動態(tài)中線長+最小二乘斜率法
? 這里引入了最小二乘法進行中線偏差的計算,擬合出一條直線,使之盡可能多地經(jīng)過中線上的點,接近曲線的形狀。這里的中線偏差通過計算出直線的斜率k來體現(xiàn)。在這種機制下,理想的偏差值應當是∞。下面給出最小二乘法擬合直線的公式:
-
固定區(qū)域中線+每行平均偏差法
在追求了很久的“動態(tài)”和“自適應”之后,發(fā)現(xiàn)那么多花里胡哨的穩(wěn)定性其實可能還不如固定的“呆”方法……
? 這個方法就是在圖像上選定兩條橫線,以這兩條橫線之間的中線為基準進行偏差計算,相當于第二種方法的某些行權(quán)值置為1,其他行都置為0。通過調(diào)整偏差計算的行數(shù),可以調(diào)整循跡前瞻和循跡軌跡,對于抖動的消除也有一定的輔助作用。采用這種方法可以較好地固定過彎軌跡。這種方法最極端的簡化版本就是使用單行循跡,只使用一行的邊界信息(龍邱的庫就是這樣的),也就是類似于CCD的原理,實測也是可行的,就是容易在彎道處因為前瞻超出了彎道外,存在一定程度的抖動,所以就不采用了(雖然但是,攝像頭不就是一個有很多行的線性CCD么hhh)。
中線與偏差的修正
彎道誤差修正
? 在以上的搜線邏輯中,在遇到邊界丟線的情況時,默認該行邊線在圖像的最左側(cè)或者最右側(cè),這樣在過彎的時候就存在一個問題:無論彎的大小,偏差值的大小都是近似的,即使在急彎誤差也非常小,使得過彎時舵機打角不足,從而導致過彎失敗。這時候就需要進行左右判別和偏差修正了。因為直道的寬度基本是固定的,所以可以先記錄下直道上圖像上各行的賽道寬,在過彎時進行左右彎的判別,判定完畢后,在已有的一側(cè)邊線上向左或者向右補上這一段賽道寬度,就可以補出另一側(cè)邊線,再利用補完后的邊線數(shù)組進行中線的計算,可以大大降低誤差。不過,這種方法對于攝像頭的安裝高度和安裝角度、前瞻距離以及攝像頭是否居中都有較高的要求。
左右彎道的判別
? 在以上修正中,需要先行判定左右彎道,如果判定不好的話,很容易在其他地方出現(xiàn)誤判,使得邊線修正異常觸發(fā),中線發(fā)生嚴重抖動。通過觀察彎道處的圖像可以發(fā)現(xiàn),彎道的特征是:指向的一側(cè)丟線較多,另一側(cè)丟線較少, 且圖像上方應當是黑色的,而且丟線較少的一側(cè)邊線橫坐標是呈現(xiàn)逐漸遞增或者遞減的,這個逐漸遞增或者遞減可以利用從下而上邊線斜率絕對值的逐漸遞減來進行判定,當然停止判定的邊界條件一定要找好,不然極其容易發(fā)生誤判,這個邊界條件是需要具體情況具體分析的,還是得自己慢慢摸索確定。根據(jù)這幾個特征編寫程序,可以有效判別彎道的左右,從而進行相應的中線修正。其實只要PID調(diào)整得夠好,這種修正也不是必要的,因為防止誤判的邊界條件最后加了很多依舊會在少數(shù)情況下發(fā)生誤判,所以最后我也棄用了這種方法。文章來源:http://www.zghlxwxcb.cn/news/detail-411544.html
偏差濾波
? 曾經(jīng)為了抑制車模運行過程中晃動使圖像抖動從而使得偏差抖動過大的情況,我也嘗試過對偏差進行濾波,使用的方法有均值濾波、加權(quán)平均遞推濾波等,但是最終效果并不是很理想,使用濾波后,車子就像喝了假酒一樣,過彎響應極其滯后(也有可能是因為圖像處理速度跟不上,當時并沒有調(diào)整過編譯器優(yōu)化),所以最終我還是放棄了偏差濾波,轉(zhuǎn)而采用使得偏差本身更加穩(wěn)定的方法計算誤差。因為使用濾波就注定要使用前幾幀的圖像信息,圖像處理至高50Hz,即使只采用前一幀的信息,延后量也達到了40ms,在2m/s的速度下這足夠使車沖出去8cm,這對于元素識別或者循跡已經(jīng)是很致命的影響了。當然也可能是我采用的濾波方法是我自己草草寫的,很不完備,如果大家對于誤差的平滑化有什么高見的話,歡迎在評論區(qū)一起交流!文章來源地址http://www.zghlxwxcb.cn/news/detail-411544.html
總結(jié)
- 利用二值化圖像的方法,首先就是將賽道邊界提取出來存入邊線數(shù)組內(nèi),使之成為可以直接參與運算的數(shù)據(jù)。
- 邊界的搜索可以使用種子生長法,對于彎道效果較好。
- 圖像的處理最終需要輸出一個循跡偏差,這個偏差可以有多種形式,也可以不止是一個參數(shù),甚至可以是一個數(shù)組甚至矩陣,但是最終反映到控制量上一定要穩(wěn)定且可靠。
- 循跡偏差計算我采用的是最簡單的固定區(qū)域平均偏差法,這種方法雖然看起來很笨,但是勝在穩(wěn)定高效。
- 理論上,偏差在彎道處是需要修正的,偏差也需要進行濾波處理,但是實測效果并不是很理想,所以暫時放棄了這個方案。
到了這里,關(guān)于【第十七屆智能車】智能車圖像處理(2)-賽道邊界的簡單提取和無元素循跡的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!