熊中華
摘要:本方案通過(guò)DMA進(jìn)行攝像頭與單片機(jī)之間的信息傳輸,采用大津法確定二值化閥值,進(jìn)行圖像分割,極大提高圖像處理速度。本文主要介紹了中心線擬合、最小二乘法補(bǔ)邊界線、特征點(diǎn)提取、十字元素與車庫(kù)元素識(shí)別與處理等算法,使智能車更平穩(wěn)快速通過(guò)多種賽道元素。
關(guān)鍵詞:DMA;大津法;最小二乘法;特征點(diǎn);十字元素;
隨著汽車保有量的不斷攀升,交通擁堵、交通事故不斷頻發(fā),越來(lái)越多的國(guó)家投入到智能網(wǎng)聯(lián)汽車的研發(fā),智能網(wǎng)聯(lián)汽車多采用傳感器融合方案,視覺(jué)傳感器作為其中一種重要的傳感器,進(jìn)行圖像采集。本文采用攝像頭傳感器進(jìn)行圖像采集,進(jìn)行賽道元素特征識(shí)別,輔助智能車快速通過(guò)多種賽道元素,對(duì)于提高城市交通智能化有著重要意義。
1攝像頭傳感器選取與安裝
1.1攝像頭傳感器選取
攝像頭傳感器是視覺(jué)檢測(cè)的核心器件,信息量豐富,相較于電磁傳感器,掃描距離更遠(yuǎn),有利于提前進(jìn)行路徑規(guī)劃。本方案采用龍邱神眼攝像頭MT9V034作為圖像傳感器,為灰度數(shù)字?jǐn)z像頭,只需3.3 V供電,分辨率為120×188,具有高動(dòng)態(tài)成像、超低功耗等多種優(yōu)點(diǎn),該攝像頭采用8位并行輸出,故像素點(diǎn)灰度值范圍為0~255。
結(jié)合智能小車循跡特點(diǎn),一般會(huì)將分辨率設(shè)置為80x60,即可獲取賽道圖像處理所需數(shù)據(jù)。高分辨率,圖像會(huì)更清晰,但數(shù)據(jù)量增加,傳輸時(shí)間延長(zhǎng),影響圖像處理效率,如果再打開串口使用上位機(jī),有機(jī)發(fā)光半導(dǎo)體(organic electroluminescence display,OLED)屏上圖像會(huì)延遲,幀率降低,也不便于調(diào)試。一般會(huì)降低分辨率提高幀率,但也會(huì)考慮算法性能,應(yīng)注重單片機(jī)處理速度與圖像刷新速度協(xié)調(diào)。
1.2攝像頭傳感器安裝
智能小車采用后輪驅(qū)動(dòng),為避免車模抖動(dòng),應(yīng)讓質(zhì)心靠后,提高小車抓地力,同時(shí)還要保證攝像頭盡量靠前,采取到更多有效數(shù)據(jù),故將攝像頭放在車模中部,關(guān)于車軸對(duì)稱。為減輕整車重量,選用空心碳素纖維管作為固定件,并用哥倆好膠水固定攝像頭角度,方便調(diào)試。
將攝像頭正裝,OLED屏幕上圖像顯示順序,從上到下依次為0~59行,從左到右依次為0~79列,一般小車前進(jìn)時(shí),近處圖像位于最大行處,遠(yuǎn)處圖像位于0行處。
2圖像傳輸
本方案采用DMA(直接存儲(chǔ)器訪問(wèn),Direct Memory Access)進(jìn)行數(shù)據(jù)傳輸,DMA可以進(jìn)行高速數(shù)據(jù)傳輸,通過(guò)DMA控制器,可以將攝像頭等外設(shè)單元采集的數(shù)據(jù)直接傳輸?shù)轿覀兊膬?nèi)存中,只有數(shù)據(jù)傳輸開始、結(jié)束時(shí)才會(huì)與CPU(中央處理器)交流,傳輸過(guò)程中,CPU可以專心進(jìn)行圖像處理;普通數(shù)據(jù)傳輸方式,每一個(gè)數(shù)據(jù)傳輸都需要依賴CPU進(jìn)行,極大占用CPU資源。DMA傳輸,極大提高了單片機(jī)處理效率,故我們采用DMA進(jìn)行數(shù)據(jù)傳輸。
FRM為場(chǎng)中斷,每當(dāng)FRM管腳連接的IO 口檢測(cè)到一個(gè)沿變化,攝像頭和單片機(jī)之間開始傳輸一副圖像數(shù)據(jù);LINE為行中斷,每當(dāng)LINE管腳連接的IO 口檢測(cè)到一個(gè)沿變化,攝像頭和單片機(jī)之間開始傳輸一行數(shù)據(jù);PIX為像素時(shí)鐘,每當(dāng)PIX管腳連接的IO 口檢測(cè)到一個(gè)沿變化,攝像頭和單片機(jī)之間開始傳輸一個(gè)數(shù)據(jù)。需要采集一副圖像時(shí),會(huì)先讀取到一個(gè)場(chǎng)信號(hào),連續(xù)兩個(gè)場(chǎng)信號(hào)之間為一副完整圖像,當(dāng)讀取到一個(gè)場(chǎng)信號(hào)后,會(huì)連續(xù)讀取到120個(gè)行信號(hào),每?jī)蓚€(gè)行信號(hào)間,會(huì)連續(xù)讀取到188個(gè)點(diǎn)信號(hào)。獲得一個(gè)場(chǎng)中斷后,開始將圖像的每一行數(shù)據(jù)存入數(shù)組,并開始進(jìn)行行累加計(jì)數(shù),當(dāng)計(jì)數(shù)達(dá)到120行后,會(huì)獲得下一個(gè)場(chǎng)中斷,一副圖像采集完畢,及時(shí)將行累加計(jì)數(shù)器清0,并置場(chǎng)結(jié)束標(biāo)志位,開始進(jìn)行數(shù)據(jù)處理。
3圖像預(yù)處理
因選用的攝像頭傳感器為灰度傳感器,無(wú)需額外進(jìn)行圖像灰度化,本方案主要采用閥值分割法進(jìn)行圖像分割。閥值的確定是閥值分割法的核心,常見(jiàn)的閥值分為:靜態(tài)閥值和動(dòng)態(tài)閥值[2],靜態(tài)閥值容易受到環(huán)境光線影響,對(duì)不同環(huán)境的賽道適應(yīng)力較差;動(dòng)態(tài)閥值抗干擾性強(qiáng),對(duì)光照變化不敏感。為更好地適應(yīng)不同賽道環(huán)境變化,本方案采用大津法確定動(dòng)態(tài)閥值。大津法(OTSU),利用統(tǒng)計(jì)學(xué)方法,讓計(jì)算機(jī)在每一張圖片上都自適應(yīng)的根據(jù)圖片整體亮度確定閾值,單片機(jī)在不同環(huán)境下都能自適應(yīng)找到不同的分割閾值,每一張圖片的閾值都不一樣,受圖像亮度和對(duì)比度的影響小,但對(duì)噪聲非常敏感。一般采集的灰度直方圖會(huì)存在兩個(gè)峰值,兩峰之間存在一個(gè)谷底,而大津法的閾值即為峰谷對(duì)應(yīng)的灰度值。
3.1大津法算法原理
假設(shè)灰度直方圖中某一灰度值,恰為峰谷,以此為閥值Threshold進(jìn)行圖像分割,將一幅圖像中所有像素分成前景和背景兩部分,前景即為白色,背景即為黑色,驗(yàn)證類間方差是否最大。為優(yōu)化算法性能,對(duì)傳統(tǒng)類間方差計(jì)算式作出變式,得到公式1,通過(guò)下式計(jì)算類間方差值:
σ=PP(E-E)(1)
式中:P為所有黑色像素占所有像素中的比例,P為所有白色像素占所有像素中的比例,E為所有黑色像素的平均灰度,E為所有白色像素的平均灰度,σ為方差值。
在所有灰度值中使類間方差值最大的灰度值即為二值化分割閥值Threshold。
3.2大津法算法邏輯與優(yōu)化
3.2.1算法邏輯
循環(huán)0~255個(gè)灰度值,記錄每一個(gè)灰度值對(duì)應(yīng)的類間方差值,將其與已知的最大類間方差值比較,記錄兩者間最大值,并進(jìn)行循環(huán)計(jì)數(shù),當(dāng)循環(huán)計(jì)數(shù)值達(dá)256次,即可確定此時(shí)最大類間方差值對(duì)應(yīng)的灰度值為二值化閥值Threshold。
3.2.2算法優(yōu)化
如果是固定賽道,可以多次試運(yùn)行大津法算法,記錄對(duì)應(yīng)多種賽道元素的二值化閥值,可以得到一個(gè)灰度值范圍,比如70~140,縮小灰度值遍歷范圍,提高算法效率。賽道上光線一般比較均勻,當(dāng)一幅圖像中包含噪聲和非均勻光照時(shí),可能會(huì)造成大津法閥值不準(zhǔn)確,而賽道圖像中部分元素灰度差別大,特別是可能會(huì)遇到上帝之光的干擾,使部分賽道光照與正常賽道光照差異較大,可以采集賽道時(shí),隔行隔列采集,以此形成的灰度直方圖,可以有效減少噪聲和非均勻光照;面對(duì)上帝之光,也可以嘗試部分區(qū)域求大津的方法,只對(duì)賽道前半部分用大津法求二值化閥值,對(duì)圖像后半部分舍棄,因?yàn)樾≤囃枰巿D像進(jìn)行數(shù)據(jù)處理,及時(shí)進(jìn)行賽道循跡,舍棄遠(yuǎn)處圖像數(shù)據(jù),可以使圖像二值化數(shù)值更接近于賽道近處值,效果更好。也可將賽道劃分為遠(yuǎn)近兩個(gè)區(qū)域,對(duì)其分別大津法求閾值,并分別加權(quán)求出更理想的二值化閾值。
一般情況下,賽道光照強(qiáng),二值化動(dòng)態(tài)閾值會(huì)更大,對(duì)于光斑等干擾,不易找到合適閾值,可以安裝濾光片等光學(xué)元器件改善。
3.3二值化
遍歷賽道所有像素點(diǎn)灰度值,如果某一像素點(diǎn)灰度值大于二值化閾值,則置為白點(diǎn)1,如果灰度值小于二值化閾值,則置為黑點(diǎn)0;
4圖像處理
4.1中線擬合與偏差
因?yàn)閿z像頭采集到的近處圖像實(shí)際中線[4]與賽道理想中線接近,遠(yuǎn)處圖像可能兩者差別比較大,所以我們一般選擇從近處到遠(yuǎn)處開始掃線。從底部第59行的理想中線位置第40列開始向左向右兩方向分別掃線,找到黑白跳變點(diǎn),記錄左右邊界點(diǎn)位置;
以向左掃線為例,當(dāng)向左掃線找到一點(diǎn)H的值同其左邊一點(diǎn)J的值差值為1時(shí),再以H點(diǎn)向左間隔3個(gè)點(diǎn)找到點(diǎn)K,計(jì)算點(diǎn)K同其左邊一點(diǎn)L的差值為0時(shí),繼續(xù)以K點(diǎn)向左間隔3個(gè)點(diǎn)找到點(diǎn)M,計(jì)算點(diǎn)M同其左邊一點(diǎn)N的差值為0時(shí),即可判斷找到第59行左邊界點(diǎn),將其計(jì)入一個(gè)大小為60的左線數(shù)組,這種方法有效避免了噪聲、光斑對(duì)邊界點(diǎn)提取的影響。同理獲得第59行右邊界坐標(biāo),左邊界坐標(biāo)與右邊界坐標(biāo)求和后除以2,即為當(dāng)前賽道第59行實(shí)際中點(diǎn)坐標(biāo),并將其存入中線數(shù)組。
向左掃線找左邊界原理如圖1所示。
繼續(xù)以第59行實(shí)際中點(diǎn)坐標(biāo)為起始點(diǎn)開始進(jìn)行第58行左右掃線,因?yàn)椴糠仲惖廊绻x取理想中點(diǎn)第40列作為下一行左右掃線起始點(diǎn),可能理想中線正好位于黑色區(qū)域,左右兩邊掃線遇到的都是黑點(diǎn),黑白跳變點(diǎn)位置同掃線起始點(diǎn)間隔較遠(yuǎn),連貫性不好,極大地浪費(fèi)CPU性能,不利于小車快速巡線。同理進(jìn)行For循環(huán)向上迭代求中線,直到掃線完60行,將各行中點(diǎn)連接,即為實(shí)際中線。
用右邊界數(shù)組減左邊界數(shù)組,可以得到賽道寬度。從起始點(diǎn)第59行第40列的像素開始,向上掃線,找到白黑跳變點(diǎn),用圖像總行數(shù)減去白黑跳變點(diǎn)的值即為賽道長(zhǎng)度;在某些特定元素判斷中,可以使用賽道寬度、賽道長(zhǎng)度作為輔助判斷,識(shí)別特定元素。
選取一個(gè)控制行,控制行與實(shí)際中線、理想中線交點(diǎn)分別為O、P,計(jì)算兩點(diǎn)差值作為偏差,乘以比例項(xiàng)系數(shù)Kp,作為PWM一部分用于小車轉(zhuǎn)向控制。也可以計(jì)算多行偏差,對(duì)遠(yuǎn)處偏差賦予低權(quán)重,近處偏差賦予高權(quán)重,進(jìn)行累加作為最終偏差,為進(jìn)一步提高車速,可以針對(duì)不同賽道元素,對(duì)多行不同區(qū)域分別賦予不同的權(quán)重。控制行的選取需要綜合考慮車速、攝像頭前瞻位置等,一般車速越快,控制行數(shù)值選取越小。
4.2丟線處理
對(duì)于部分特殊賽道或者當(dāng)小車偏離賽道理想中線時(shí),可能無(wú)法找到邊界線。當(dāng)出現(xiàn)單邊丟線時(shí),根據(jù)不同賽道元素,有多種處理方法,以左邊丟線為例,可以將圖像左邊框線規(guī)定為黑點(diǎn)0,當(dāng)算法向左掃線檢測(cè)到只有第0列有黑點(diǎn)0的時(shí)候,即判定該點(diǎn)為左邊界點(diǎn);也可以選擇找到某一特殊點(diǎn),比如拐點(diǎn),利用拐點(diǎn)和其他已知點(diǎn)進(jìn)行補(bǔ)線,一般采用最小二乘法[5]補(bǔ)線處理賽道元素。可以找到左邊界丟線前的5個(gè)左邊界點(diǎn),利用公式2和公式3計(jì)算出擬合直線的K和B,將丟線后的行數(shù)依次作為縱坐標(biāo)帶入公式4計(jì)算出橫坐標(biāo),補(bǔ)齊左邊界。
當(dāng)出現(xiàn)雙邊丟線時(shí),一般是處于特殊元素十字路口處,可以選擇存儲(chǔ)歷史數(shù)組的方法,用之前的實(shí)際中線數(shù)據(jù)過(guò)特殊元素。也可以選擇通過(guò)左右拐點(diǎn)等同時(shí)補(bǔ)線,通過(guò)兩邊界丟線處附件已知的5個(gè)邊界點(diǎn)分別擬合出兩條直線,補(bǔ)全左右邊界。為降低算法復(fù)雜度,也可以直接使用丟線前幾行的賽道進(jìn)行直接補(bǔ)線,因車速、電池電量等情況,可能會(huì)不穩(wěn)定。
4.3特征點(diǎn)
圖2中:A點(diǎn)為左下拐點(diǎn)、B點(diǎn)為右下拐點(diǎn)、C點(diǎn)為左上拐點(diǎn)、D點(diǎn)為右上拐點(diǎn)、E點(diǎn)為起始行左邊界、F點(diǎn)為起始行右邊界。
正常直道的邊界線斜率為定值,當(dāng)存在拐點(diǎn)時(shí),如圖2標(biāo)注所示,邊界線斜率會(huì)在拐點(diǎn)前后發(fā)生突變,A 為左下拐點(diǎn),在A點(diǎn)下方的左邊界線為固定斜率的右傾直線,當(dāng)從下往上掃線找邊界求中線時(shí),突然發(fā)現(xiàn)A點(diǎn)上方的左邊界斜率急劇變緩,自A點(diǎn)開始向左接近水平生長(zhǎng);
B為右下拐點(diǎn),在B點(diǎn)下方的右邊界線為固定斜率的左傾直線,當(dāng)從下往上掃線找邊界求中線時(shí),突然發(fā)現(xiàn)B點(diǎn)上方的右邊界斜率急劇變緩,自B點(diǎn)開始向右接近水平生長(zhǎng);
同理可知,C為左上拐點(diǎn),在C點(diǎn)下方的左邊界線自右向左接近水平生長(zhǎng),斜率較小,在C點(diǎn)上方的左邊界斜率急劇變大;D為右上拐點(diǎn),在D點(diǎn)下方的右邊界線自右向左接近水平生長(zhǎng),斜率較小,在D點(diǎn)上方的右邊界線斜率急劇變大。
以找左下拐點(diǎn)A為例,假設(shè)選取邊界點(diǎn)R,R點(diǎn)縱坐標(biāo)行數(shù)為i,判斷其是否為左下拐點(diǎn),掃線找邊界時(shí),比較R點(diǎn)附近連續(xù)幾行左邊界點(diǎn)對(duì)應(yīng)的橫坐標(biāo),即其對(duì)應(yīng)的列數(shù),分組兩兩計(jì)算連續(xù)左邊界點(diǎn)橫坐標(biāo)差值,發(fā)現(xiàn)第i行與第i-1行對(duì)應(yīng)的橫坐標(biāo)差值為正數(shù)T,第i+1行與第i行對(duì)應(yīng)的橫坐標(biāo)差值絕對(duì)值為T,并且T-T差值大于某一閾值,連續(xù)多組左邊界點(diǎn)都符合上述條件,并且R點(diǎn)上方出現(xiàn)較多空白行,即判定為左下拐點(diǎn)A,單獨(dú)用變量記錄左下拐點(diǎn)A值,用于后續(xù)補(bǔ)線。
4.4十字路口處理
4.4.1正入十字路口
當(dāng)左右掃線找到左下拐點(diǎn)A、右下拐點(diǎn)B,且從左下拐點(diǎn)向上隔行掃描2行,發(fā)現(xiàn)下拐點(diǎn)上方白點(diǎn)數(shù)目大于某一設(shè)定值時(shí),即可判定正入十字。
十字路口下拐點(diǎn)上方有多行空白行,發(fā)生丟邊現(xiàn)象,需要找特征點(diǎn),使用最小二乘法構(gòu)造邊界線。左右巡線找到左下拐點(diǎn)A、右下拐點(diǎn)B、左上拐點(diǎn)C、右上拐點(diǎn)D,利用斜截式分別構(gòu)造線段AC、BD,補(bǔ)出拐點(diǎn)空白行的左右邊界線,再利用左右邊界線求和除以2作為實(shí)際中線。正入十字元素補(bǔ)線圖如圖3所示。
進(jìn)入圓環(huán)后,可以正常掃線找到左右邊界,出環(huán)后,用相同方法補(bǔ)線出十字路口。
4.4.2斜入十字路口
以左斜進(jìn)入十字路口為例,當(dāng)左右掃線找到左下拐點(diǎn)A、右上拐點(diǎn)D,判定為斜入十字。
十字路口下拐點(diǎn)上方有多行空白行,發(fā)生丟邊現(xiàn)象,需要找特征點(diǎn),使用最小二乘法構(gòu)造邊界線。左右掃線找到左下拐點(diǎn)A、左上拐點(diǎn)C、右上拐點(diǎn)D,利用斜截式構(gòu)造線段AC,作為左下拐點(diǎn)上方空白行的左邊界;取右上拐點(diǎn)D點(diǎn)后方5個(gè)邊界點(diǎn),利用最小二乘法反向補(bǔ)線,從第59行作為縱坐標(biāo)代入最小二乘法擬合右邊界線,循環(huán)到y(tǒng)取值為D點(diǎn)縱坐標(biāo),補(bǔ)出丟失的右上拐點(diǎn)下方的右邊界,再利用左右邊界線求和除以2作為實(shí)際中線,斜入十字元素補(bǔ)線圖如4所示。
4.5車庫(kù)元素處理
以右入車庫(kù)為例,車庫(kù)有比較明顯的特點(diǎn):左邊界為直線,右邊界丟線,可以找到右下拐點(diǎn)B,空白行上方存在斑馬線。
先找到右下拐點(diǎn)B,右下拐點(diǎn)B上方存在空白行,繼續(xù)向上掃線,從右向左掃線,找到白黑跳變點(diǎn),跳變點(diǎn)計(jì)數(shù),繼續(xù)掃線,發(fā)現(xiàn)黑白跳變點(diǎn),計(jì)算兩者差值,發(fā)現(xiàn)在某一范圍,對(duì)從右向左循線沿途中遇到的所有跳變點(diǎn)計(jì)數(shù),發(fā)現(xiàn)大于某一閾值,同時(shí)滿足上述條件,即判定為車庫(kù)元素。
找到右下拐點(diǎn)B后,B點(diǎn)橫坐標(biāo)減去賽道寬度,即確定到Z點(diǎn)坐標(biāo),因斑馬線總寬度小于賽道寬度,所以可以找到右上拐點(diǎn)D點(diǎn),用最小二乘法構(gòu)造線段ZD,通過(guò)線段ZD加上最近處賽道一半構(gòu)造出實(shí)際中心線,小車沿實(shí)際中心線順利入庫(kù)。車庫(kù)元素補(bǔ)線圖如5所示。
5結(jié)語(yǔ)
本方案主要通過(guò)DMA傳輸數(shù)據(jù)、大津法分割圖像,提高單片機(jī)處理性能;尋找賽道元素特征點(diǎn),擬合賽道中線,并對(duì)特殊元素進(jìn)行識(shí)別與處理,使智能車更平穩(wěn)快速通過(guò)多種賽道元素,達(dá)到了設(shè)計(jì)要求。
參考文獻(xiàn):
[1]符曉明.基于ADSP-BF60X網(wǎng)絡(luò)通信的DMA配置模式及中斷方法實(shí)現(xiàn)[J].中國(guó)計(jì)量,2018(03):109-110+112.
[2]巴德凱.自適應(yīng)圖像分割及并行挖掘方法的研究與實(shí)現(xiàn)[D].北京:北方工業(yè)大學(xué),2016.
[3]孫少林,馬志強(qiáng),湯偉.灰度圖像二值化算法研究[J].價(jià)值工程,2010,29(05):142-143.
[4]蔡栩嘉,劉海剛,陳冠成,李勇祥,莊越.攝像頭智能小車設(shè)計(jì)與控制算法研究[J].工業(yè)控制計(jì)算機(jī),2018,31(12):98-101.
[5]徐翔,王琪,高進(jìn)可,秦海亭,張鈺潔.智能車車道識(shí)別與圖像處理[J].自動(dòng)化技術(shù)與應(yīng)用,2020,39(07):91-95.