徐弘揚(yáng)
(合肥工業(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院,,安徽 合肥 230009)
摘要:系統(tǒng)以三星處理器S3C6410為硬件平臺(tái),,Linux操作系統(tǒng)為軟件平臺(tái),利用OpenCV視覺(jué)算法庫(kù)和交叉編譯環(huán)境,,在A(yíng)RM平臺(tái)上進(jìn)行圖像處理與車(chē)牌識(shí)別,,并完成了SD卡模塊、網(wǎng)絡(luò)模塊和圖像采集模塊的驅(qū)動(dòng)開(kāi)發(fā),。針對(duì)在A(yíng)RM平臺(tái)上處理數(shù)字圖像數(shù)據(jù)量大、耗時(shí)長(zhǎng)的情況,,提出了多線(xiàn)程處理模式和中斷線(xiàn)程化方法,,極大地提高了系統(tǒng)的實(shí)時(shí)性。
關(guān)鍵詞:嵌入式Linux,;OpenCV,;車(chē)牌識(shí)別;多線(xiàn)程,;中斷線(xiàn)程化
0引言
與基于X86平臺(tái)的傳統(tǒng)圖像處理系統(tǒng)相比,,嵌入式系統(tǒng)具有專(zhuān)用性強(qiáng)、處理速度快,、軟硬件可裁剪等優(yōu)點(diǎn)[1],。本文基于A(yíng)RM平臺(tái)和OpenCV視覺(jué)算法庫(kù),采用多線(xiàn)程處理模式和中斷線(xiàn)程化方法,實(shí)現(xiàn)對(duì)車(chē)牌圖像的快速處理與識(shí)別,。
1系統(tǒng)總體設(shè)計(jì)
本系統(tǒng)主要由S3C6410處理器,、圖像采集模塊、紅外對(duì)射模塊,、SD卡模塊和網(wǎng)絡(luò)通信模塊組成,。總體結(jié)構(gòu)框圖如圖1所示,?! ?/p>
紅外對(duì)射模塊檢測(cè)等待區(qū)是否有車(chē)輛,如有車(chē)輛停放,,發(fā)送信號(hào)給處理器,,并啟動(dòng)攝像頭采集圖像[2];SD卡模塊用于存放車(chē)牌字符的模板庫(kù),,處理器識(shí)別出車(chē)牌號(hào)并與SD卡中的字符模板進(jìn)行匹配,;網(wǎng)絡(luò)通信模塊將車(chē)輛圖像信息直接上傳給服務(wù)器。
2Linux平臺(tái)搭建
2.1OpenCV移植
考慮到圖像處理算法設(shè)計(jì)難度大,、開(kāi)發(fā)周期長(zhǎng),、代碼效率低等問(wèn)題,本系統(tǒng)在Linux開(kāi)發(fā)環(huán)境下,,調(diào)用成熟高效的OpenCV函數(shù)庫(kù),,利用交叉編譯,生成在目標(biāo)機(jī)上可運(yùn)行的代碼,。
?。?)安裝OpenCV依賴(lài)庫(kù)
OpenCV依賴(lài)于libpng、libjpeg,、libstdcpp,、libpthread等庫(kù),而這些庫(kù)又依賴(lài)于其他一些庫(kù)文件,,所有需依賴(lài)的庫(kù)都要編譯安裝,。
(2)配置OpenCV
進(jìn)入OpenCV根目錄,,運(yùn)行./config,,對(duì)OpenCV進(jìn)行配置:--host=arm-linux指定交叉編譯為ARM平臺(tái);--enablestatic表示生成靜態(tài)庫(kù),。
2.2-Uboot移植
Bootloader是系統(tǒng)上電/復(fù)位后,,內(nèi)核啟動(dòng)程序之前的一小段代碼,其功能是初始化硬件設(shè)備,,并將操作系統(tǒng)內(nèi)核裝載到RAM中運(yùn)行,。U-boot作為一個(gè)主流,、通用的Bootloader,被成功移植到包括PowerPC,、ARM,、X86、MIPS等多種體系結(jié)構(gòu)的處理器上,。
2.2.1網(wǎng)卡驅(qū)動(dòng)移植
系統(tǒng)采用DM9000網(wǎng)卡控制器進(jìn)行網(wǎng)絡(luò)通信,,所以需要在板級(jí)配置文件My6410.h中屏蔽掉原有的cs8900配置,并添加對(duì)DM9000的支持,。
要使掛接在BANK1上的DM9000正常工作,,需要配置SROM控制器相關(guān)的寄存器。在板級(jí)初始化文件My6410.c中,,添加DM9000初始化函數(shù)dm9000_init(),,并修改寄存器SROM_BCn相應(yīng)位值。
#define DM9000_Tacs0x2/*2clk
#define DM9000_Tcos0x1/*0clk
#define DM9000_Tacc0x1/*2clk
#define DM9000_Tcoh0x0/*0clk
#define DM9000_Tcah0x2/*2clk
#define DM9000_Tacp0x2/*2clk
#define DM9000_PMC0x0/*1data
2.2.2SD卡驅(qū)動(dòng)移植
U-boot中并沒(méi)有實(shí)現(xiàn)針對(duì)S3C6410 SD/MMC控制器的驅(qū)動(dòng)程序,,需要自行添加代碼,,實(shí)現(xiàn)SD卡的初始化、命令處理,、塊設(shè)備讀等操作,。
驅(qū)動(dòng)文件sd_driver.c中,函數(shù)sd_init()實(shí)現(xiàn)SD卡初始化,,它首先對(duì)SD/MMC主控制器時(shí)鐘,、中斷等進(jìn)行初始化,然后通過(guò)主控制器向SD卡發(fā)送命令,,命令操作通過(guò)函數(shù)sd_cmd()實(shí)現(xiàn),。SD卡讀操作函數(shù)sd_read用于從SD卡中將源地址從src開(kāi)始,大小為size的數(shù)據(jù)讀取到dst指定的地址中,。sd_read函數(shù)原型為:
sd_read(src,dst,blkcnt *sd_block_size)
2.2.3USB驅(qū)動(dòng)移植
本系統(tǒng)采用USB接口的圖像采集模塊,,為使該模塊正常工作,需要移植USB驅(qū)動(dòng),。U-boot中已經(jīng)實(shí)現(xiàn)了較完整的主機(jī)OHCI驅(qū)動(dòng),,但沒(méi)有USB設(shè)備驅(qū)動(dòng)的代碼,所以需要添加這部分代碼,。
在板級(jí)配置文件My6410.h中進(jìn)行相應(yīng)配置,使U-boot支持USB設(shè)備驅(qū)動(dòng),、USB主機(jī)驅(qū)動(dòng)及命令和USB存儲(chǔ)設(shè)備,,并在include/s3c6410.h中完善對(duì)S3C6410 USB OTG控制器寄存器的定義。
3車(chē)輛圖像處理
對(duì)于攝像頭采集的車(chē)輛圖像處理主要分為3個(gè)步驟:車(chē)牌定位,、字符分割和字符識(shí)別,。其中,,車(chē)牌定位是整個(gè)處理過(guò)程的基礎(chǔ),其定位的準(zhǔn)確與否直接影響到車(chē)牌的字符分割和識(shí)別效果,。圖2給出車(chē)牌定位的一般流程,。
從OpenCV函數(shù)庫(kù)角度來(lái)說(shuō),,調(diào)用cvCvtColor函數(shù)對(duì)彩色圖像進(jìn)行灰度化處理,;利用Soble算子對(duì)圖像進(jìn)行垂直方向的邊緣檢測(cè);再對(duì)圖像進(jìn)行閾值分割,,取合適的閾值,,將圖像轉(zhuǎn)換為二值圖像;為了消除圖像噪聲,,還要對(duì)其進(jìn)行濾波操作,,本系統(tǒng)采用的是形態(tài)學(xué)濾波方法,先使用閉運(yùn)算操作再使用開(kāi)運(yùn)算操作,,兩種運(yùn)算都包含腐蝕與膨脹,;形態(tài)學(xué)運(yùn)算后得到少部分矩形區(qū)域,即為車(chē)牌的候選區(qū)域,,可以使用cvFindContours函數(shù)來(lái)實(shí)現(xiàn)輪廓檢測(cè),,然后根據(jù)我國(guó)車(chē)牌長(zhǎng)寬比的特征,即44:14,,定位車(chē)牌區(qū)域,。
車(chē)牌區(qū)域提取出來(lái)后,要將車(chē)牌字符分割,,由于可能存在車(chē)牌傾斜的情況,,導(dǎo)致字符分割與識(shí)別不準(zhǔn)確,因此要先使用Hough算法[3]對(duì)車(chē)牌進(jìn)行傾斜校正,,然后將車(chē)牌字符在垂直方向上投影,,字符之間的間隙會(huì)在投影上產(chǎn)生低谷,從而實(shí)現(xiàn)字符分割,。分割完成后,,對(duì)各個(gè)字符進(jìn)行識(shí)別,采用基于模板匹配的ORC算法,,將字符尺寸縮放至與SD卡中存儲(chǔ)的模板大小一致并匹配,,得出最佳的匹配結(jié)果。
4系統(tǒng)實(shí)時(shí)性改進(jìn)
本系統(tǒng)采用三星S3C6410處理器,,該CPU基于A(yíng)RM1176JZF-S內(nèi)核,,由8級(jí)流水線(xiàn)組成,主頻可達(dá)522 MHz,,最高可達(dá)667 MHz,,但由于在A(yíng)RM平臺(tái)上處理數(shù)字圖像數(shù)據(jù)量大,、過(guò)程復(fù)雜的特點(diǎn),系統(tǒng)實(shí)時(shí)性還有待提高,。
4.1多線(xiàn)程處理
線(xiàn)程是進(jìn)程的一個(gè)實(shí)體,,是CPU調(diào)度和分配的基本單元,它不擁有系統(tǒng)資源,,但可與同一進(jìn)程中的其他線(xiàn)程共享該進(jìn)程的所有資源,。本系統(tǒng)采用多線(xiàn)程處理方法,主程序中創(chuàng)建4個(gè)線(xiàn)程,,分別用于圖像采集,、圖像解壓、灰度化和網(wǎng)絡(luò)通信,。圖像采集線(xiàn)程從圖像傳感器中讀取圖像信息,,圖像解壓線(xiàn)程利用libjpeg庫(kù)將讀取到的JPEG圖像轉(zhuǎn)換為BMP圖像,灰度化線(xiàn)程對(duì)得到的BMP圖像進(jìn)行灰度化處理,,網(wǎng)絡(luò)通信線(xiàn)程用于將讀取到的圖像發(fā)送給服務(wù)器,。為此,還要?jiǎng)?chuàng)建兩個(gè)FIFO,,用于線(xiàn)程間的資源共享,,第一個(gè)FIFO用來(lái)存放圖像采集線(xiàn)程讀取到的圖像信息,可被圖像解壓線(xiàn)程和網(wǎng)絡(luò)通信線(xiàn)程共享,;第二個(gè)FIFO用來(lái)存放解壓后的圖像數(shù)據(jù),,用于灰度化線(xiàn)程的處理。這4個(gè)線(xiàn)程并發(fā)執(zhí)行,,大大提高了CPU的利用率和處理速度,,便于實(shí)時(shí)控制。
得到灰度化圖像之后,,還需對(duì)圖像進(jìn)行進(jìn)一步處理,,如果按照“邊緣檢測(cè)—二值化—形態(tài)學(xué)濾波”的步驟執(zhí)行,則耗時(shí)太長(zhǎng),,不利于提高系統(tǒng)實(shí)時(shí)性,。這里開(kāi)啟3個(gè)線(xiàn)程,分別用于邊緣檢測(cè),、二值化和形態(tài)學(xué)濾波,。由于這3個(gè)線(xiàn)程執(zhí)行過(guò)程中有依賴(lài)關(guān)系,因此還要?jiǎng)?chuàng)建兩個(gè)FIFO,,分別用于存放邊緣檢測(cè)后的圖像數(shù)據(jù)和二值化后的圖像數(shù)據(jù),。改進(jìn)后的車(chē)牌定位流程圖如圖3所示?! ?/p>
4.2中斷線(xiàn)程化
在Linux標(biāo)準(zhǔn)內(nèi)核中,,中斷是最高優(yōu)先級(jí)的執(zhí)行單元,當(dāng)中斷觸發(fā)時(shí),,內(nèi)核必須立即響應(yīng)中斷并執(zhí)行響應(yīng)的中斷處理程序,,且不會(huì)被其他任何程序打斷,這會(huì)導(dǎo)致實(shí)時(shí)任務(wù)得不到及時(shí)處理,,如果系統(tǒng)IO負(fù)載嚴(yán)重,,中斷會(huì)非常頻繁,實(shí)時(shí)任務(wù)很難有機(jī)會(huì)運(yùn)行[4],。本系統(tǒng)采用中斷線(xiàn)程化方式,,為中斷創(chuàng)建線(xiàn)程,中斷作為內(nèi)核線(xiàn)程被賦予相應(yīng)的優(yōu)先級(jí),,該優(yōu)先級(jí)可以低于對(duì)實(shí)時(shí)性要求更高的任務(wù),,確保實(shí)時(shí)任務(wù)被優(yōu)先快速執(zhí)行,提高系統(tǒng)實(shí)時(shí)性[5],。
具體實(shí)現(xiàn)方法為:在內(nèi)核初始化函數(shù)init()中調(diào)用init_hardirqs()函數(shù),,為相應(yīng)中斷創(chuàng)建一個(gè)內(nèi)核線(xiàn)程,并分配優(yōu)先級(jí),。本系統(tǒng)中主要有3種中斷:SD卡傳輸中斷,、網(wǎng)絡(luò)傳輸中斷和OTG中斷。
創(chuàng)建中斷線(xiàn)程函數(shù):desc->thread = kthread_create(do_irqd,,desc,,“IRQ %d”,irq),,irq為相應(yīng)中斷的中斷號(hào),。
當(dāng)中斷發(fā)生時(shí),系統(tǒng)調(diào)用do_IRQ()函數(shù),,處理與架構(gòu)相關(guān)的部分,,然后調(diào)用_do_IRQ()函數(shù)判斷中斷描述符的狀態(tài)字段是否包含SA_NODELAY標(biāo)志,若包含則該中斷已被線(xiàn)程化,,喚醒相應(yīng)的中斷處理線(xiàn)程,;反之則調(diào)用handle_IRQ_event()函數(shù)直接轉(zhuǎn)入中斷服務(wù)程序處理。
5結(jié)論
本系統(tǒng)基于Linux軟件平臺(tái)和ARM硬件平臺(tái),,利用OpenCV視覺(jué)算法庫(kù),,在嵌入式系統(tǒng)上實(shí)現(xiàn)車(chē)牌識(shí)別。該系統(tǒng)與基于X86平臺(tái)的系統(tǒng)相比,,實(shí)現(xiàn)了系統(tǒng)專(zhuān)用性,、便攜性等特點(diǎn);與基于DSP平臺(tái)的系統(tǒng)相比,,大大降低了成本,。針對(duì)ARM平臺(tái)處理數(shù)字圖像系統(tǒng)實(shí)時(shí)性不足問(wèn)題,,提出多線(xiàn)程處理和中斷線(xiàn)程化方法,極大地提高了系統(tǒng)的實(shí)時(shí)性,。實(shí)驗(yàn)結(jié)果表明,,采用這種方法,從采集圖像到完成識(shí)別所用時(shí)間大大減少,,系統(tǒng)執(zhí)行效率極大提高,,完全能夠滿(mǎn)足實(shí)時(shí)處理數(shù)字圖像的需求。
參考文獻(xiàn)
?。?] 田紅鵬,,焦鑫. 基于嵌入式Linux和OpenCV的車(chē)牌定位方法[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2014,,35(11):39083911.
?。?] 郭建,孫青,,黃霞. 基于圖像引導(dǎo)的自動(dòng)導(dǎo)引小車(chē)系統(tǒng)設(shè)計(jì)[J]. 測(cè)控技術(shù),,2012,31(7):3841.
[3] MUKHOPADHYAY P,,CHAUDHURI B B. A survey of Hough transform[J].Pattern Recognition,,2015,48(3):9931010.
?。?] 孫首昌,,韓紅芳,孟煜. 嵌入式Linux實(shí)時(shí)技術(shù)改進(jìn)與實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息,,2007,,23(122):6768.
[5] 單承剛. 嵌入式Linux下的實(shí)時(shí)性增強(qiáng)方案[J]. 電子技術(shù)應(yīng)用,,2010,,36(7):137139.