《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式Linux的卡口車輛檢測系統(tǒng)設(shè)計(jì)
基于嵌入式Linux的卡口車輛檢測系統(tǒng)設(shè)計(jì)
2016年微型機(jī)與應(yīng)用第12期
徐弘揚(yáng)
(合肥工業(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院,安徽 合肥 230009)
摘要: 系統(tǒng)以三星處理器S3C6410為硬件平臺,Linux操作系統(tǒng)為軟件平臺,利用OpenCV視覺算法庫和交叉編譯環(huán)境,在ARM平臺上進(jìn)行圖像處理與車牌識別,并完成了SD卡模塊、網(wǎng)絡(luò)模塊和圖像采集模塊的驅(qū)動開發(fā)。針對在ARM平臺上處理數(shù)字圖像數(shù)據(jù)量大、耗時長的情況,提出了多線程處理模式和中斷線程化方法,極大地提高了系統(tǒng)的實(shí)時性。
Abstract:
Key words :

  徐弘揚(yáng)

 ?。ê戏使I(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院,安徽 合肥 230009)

  摘要:系統(tǒng)以三星處理器S3C6410為硬件平臺,Linux操作系統(tǒng)為軟件平臺,利用OpenCV視覺算法庫和交叉編譯環(huán)境,在ARM平臺上進(jìn)行圖像處理與車牌識別,并完成了SD卡模塊、網(wǎng)絡(luò)模塊和圖像采集模塊的驅(qū)動開發(fā)。針對在ARM平臺上處理數(shù)字圖像數(shù)據(jù)量大、耗時長的情況,提出了多線程處理模式和中斷線程化方法,極大地提高了系統(tǒng)的實(shí)時性。

  關(guān)鍵詞嵌入式Linux;OpenCV;車牌識別;多線程;中斷線程化

0引言

  與基于X86平臺的傳統(tǒng)圖像處理系統(tǒng)相比,嵌入式系統(tǒng)具有專用性強(qiáng)、處理速度快、軟硬件可裁剪等優(yōu)點(diǎn)[1]。本文基于ARM平臺和OpenCV視覺算法庫,采用多線程處理模式和中斷線程化方法,實(shí)現(xiàn)對車牌圖像的快速處理與識別。

1系統(tǒng)總體設(shè)計(jì)

  本系統(tǒng)主要由S3C6410處理器、圖像采集模塊、紅外對射模塊、SD卡模塊和網(wǎng)絡(luò)通信模塊組成??傮w結(jié)構(gòu)框圖如圖1所示?! ?/p>

001.jpg

  紅外對射模塊檢測等待區(qū)是否有車輛,如有車輛停放,發(fā)送信號給處理器,并啟動攝像頭采集圖像[2];SD卡模塊用于存放車牌字符的模板庫,處理器識別出車牌號并與SD卡中的字符模板進(jìn)行匹配;網(wǎng)絡(luò)通信模塊將車輛圖像信息直接上傳給服務(wù)器。

2Linux平臺搭建

  2.1OpenCV移植

  考慮到圖像處理算法設(shè)計(jì)難度大、開發(fā)周期長、代碼效率低等問題,本系統(tǒng)在Linux開發(fā)環(huán)境下,調(diào)用成熟高效的OpenCV函數(shù)庫,利用交叉編譯,生成在目標(biāo)機(jī)上可運(yùn)行的代碼。

 ?。?)安裝OpenCV依賴庫

  OpenCV依賴于libpng、libjpeg、libstdcpp、libpthread等庫,而這些庫又依賴于其他一些庫文件,所有需依賴的庫都要編譯安裝。

  (2)配置OpenCV

  進(jìn)入OpenCV根目錄,運(yùn)行./config,對OpenCV進(jìn)行配置:--host=arm-linux指定交叉編譯為ARM平臺;--enablestatic表示生成靜態(tài)庫。

  2.2-Uboot移植

  Bootloader是系統(tǒng)上電/復(fù)位后,內(nèi)核啟動程序之前的一小段代碼,其功能是初始化硬件設(shè)備,并將操作系統(tǒng)內(nèi)核裝載到RAM中運(yùn)行。U-boot作為一個主流、通用的Bootloader,被成功移植到包括PowerPC、ARM、X86、MIPS等多種體系結(jié)構(gòu)的處理器上。

  2.2.1網(wǎng)卡驅(qū)動移植

  系統(tǒng)采用DM9000網(wǎng)卡控制器進(jìn)行網(wǎng)絡(luò)通信,所以需要在板級配置文件My6410.h中屏蔽掉原有的cs8900配置,并添加對DM9000的支持。

  要使掛接在BANK1上的DM9000正常工作,需要配置SROM控制器相關(guān)的寄存器。在板級初始化文件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ū)動移植

  U-boot中并沒有實(shí)現(xiàn)針對S3C6410 SD/MMC控制器的驅(qū)動程序,需要自行添加代碼,實(shí)現(xiàn)SD卡的初始化、命令處理、塊設(shè)備讀等操作。

  驅(qū)動文件sd_driver.c中,函數(shù)sd_init()實(shí)現(xiàn)SD卡初始化,它首先對SD/MMC主控制器時鐘、中斷等進(jìn)行初始化,然后通過主控制器向SD卡發(fā)送命令,命令操作通過函數(shù)sd_cmd()實(shí)現(xiàn)。SD卡讀操作函數(shù)sd_read用于從SD卡中將源地址從src開始,大小為size的數(shù)據(jù)讀取到dst指定的地址中。sd_read函數(shù)原型為:

  sd_read(src,dst,blkcnt *sd_block_size)

  2.2.3USB驅(qū)動移植

  本系統(tǒng)采用USB接口的圖像采集模塊,為使該模塊正常工作,需要移植USB驅(qū)動。U-boot中已經(jīng)實(shí)現(xiàn)了較完整的主機(jī)OHCI驅(qū)動,但沒有USB設(shè)備驅(qū)動的代碼,所以需要添加這部分代碼。

  在板級配置文件My6410.h中進(jìn)行相應(yīng)配置,使U-boot支持USB設(shè)備驅(qū)動、USB主機(jī)驅(qū)動及命令和USB存儲設(shè)備,并在include/s3c6410.h中完善對S3C6410 USB OTG控制器寄存器的定義。

3車輛圖像處理

  對于攝像頭采集的車輛圖像處理主要分為3個步驟:車牌定位、字符分割和字符識別。其中,車牌定位是整個處理過程的基礎(chǔ),其定位的準(zhǔn)確與否直接影響到車牌的字符分割和識別效果。圖2給出車牌定位的一般流程?! ?/p>

002.jpg

  從OpenCV函數(shù)庫角度來說,調(diào)用cvCvtColor函數(shù)對彩色圖像進(jìn)行灰度化處理;利用Soble算子對圖像進(jìn)行垂直方向的邊緣檢測;再對圖像進(jìn)行閾值分割,取合適的閾值,將圖像轉(zhuǎn)換為二值圖像;為了消除圖像噪聲,還要對其進(jìn)行濾波操作,本系統(tǒng)采用的是形態(tài)學(xué)濾波方法,先使用閉運(yùn)算操作再使用開運(yùn)算操作,兩種運(yùn)算都包含腐蝕與膨脹;形態(tài)學(xué)運(yùn)算后得到少部分矩形區(qū)域,即為車牌的候選區(qū)域,可以使用cvFindContours函數(shù)來實(shí)現(xiàn)輪廓檢測,然后根據(jù)我國車牌長寬比的特征,即44:14,定位車牌區(qū)域。

  車牌區(qū)域提取出來后,要將車牌字符分割,由于可能存在車牌傾斜的情況,導(dǎo)致字符分割與識別不準(zhǔn)確,因此要先使用Hough算法[3]對車牌進(jìn)行傾斜校正,然后將車牌字符在垂直方向上投影,字符之間的間隙會在投影上產(chǎn)生低谷,從而實(shí)現(xiàn)字符分割。分割完成后,對各個字符進(jìn)行識別,采用基于模板匹配的ORC算法,將字符尺寸縮放至與SD卡中存儲的模板大小一致并匹配,得出最佳的匹配結(jié)果。

4系統(tǒng)實(shí)時性改進(jìn)

  本系統(tǒng)采用三星S3C6410處理器,該CPU基于ARM1176JZF-S內(nèi)核,由8級流水線組成,主頻可達(dá)522 MHz,最高可達(dá)667 MHz,但由于在ARM平臺上處理數(shù)字圖像數(shù)據(jù)量大、過程復(fù)雜的特點(diǎn),系統(tǒng)實(shí)時性還有待提高。

  4.1多線程處理

  線程是進(jìn)程的一個實(shí)體,是CPU調(diào)度和分配的基本單元,它不擁有系統(tǒng)資源,但可與同一進(jìn)程中的其他線程共享該進(jìn)程的所有資源。本系統(tǒng)采用多線程處理方法,主程序中創(chuàng)建4個線程,分別用于圖像采集、圖像解壓、灰度化和網(wǎng)絡(luò)通信。圖像采集線程從圖像傳感器中讀取圖像信息,圖像解壓線程利用libjpeg庫將讀取到的JPEG圖像轉(zhuǎn)換為BMP圖像,灰度化線程對得到的BMP圖像進(jìn)行灰度化處理,網(wǎng)絡(luò)通信線程用于將讀取到的圖像發(fā)送給服務(wù)器。為此,還要創(chuàng)建兩個FIFO,用于線程間的資源共享,第一個FIFO用來存放圖像采集線程讀取到的圖像信息,可被圖像解壓線程和網(wǎng)絡(luò)通信線程共享;第二個FIFO用來存放解壓后的圖像數(shù)據(jù),用于灰度化線程的處理。這4個線程并發(fā)執(zhí)行,大大提高了CPU的利用率和處理速度,便于實(shí)時控制。

  得到灰度化圖像之后,還需對圖像進(jìn)行進(jìn)一步處理,如果按照“邊緣檢測—二值化—形態(tài)學(xué)濾波”的步驟執(zhí)行,則耗時太長,不利于提高系統(tǒng)實(shí)時性。這里開啟3個線程,分別用于邊緣檢測、二值化和形態(tài)學(xué)濾波。由于這3個線程執(zhí)行過程中有依賴關(guān)系,因此還要創(chuàng)建兩個FIFO,分別用于存放邊緣檢測后的圖像數(shù)據(jù)和二值化后的圖像數(shù)據(jù)。改進(jìn)后的車牌定位流程圖如圖3所示。  

003.jpg

  4.2中斷線程化

  在Linux標(biāo)準(zhǔn)內(nèi)核中,中斷是最高優(yōu)先級的執(zhí)行單元,當(dāng)中斷觸發(fā)時,內(nèi)核必須立即響應(yīng)中斷并執(zhí)行響應(yīng)的中斷處理程序,且不會被其他任何程序打斷,這會導(dǎo)致實(shí)時任務(wù)得不到及時處理,如果系統(tǒng)IO負(fù)載嚴(yán)重,中斷會非常頻繁,實(shí)時任務(wù)很難有機(jī)會運(yùn)行[4]。本系統(tǒng)采用中斷線程化方式,為中斷創(chuàng)建線程,中斷作為內(nèi)核線程被賦予相應(yīng)的優(yōu)先級,該優(yōu)先級可以低于對實(shí)時性要求更高的任務(wù),確保實(shí)時任務(wù)被優(yōu)先快速執(zhí)行,提高系統(tǒng)實(shí)時性[5]。

  具體實(shí)現(xiàn)方法為:在內(nèi)核初始化函數(shù)init()中調(diào)用init_hardirqs()函數(shù),為相應(yīng)中斷創(chuàng)建一個內(nèi)核線程,并分配優(yōu)先級。本系統(tǒng)中主要有3種中斷:SD卡傳輸中斷、網(wǎng)絡(luò)傳輸中斷和OTG中斷。

  創(chuàng)建中斷線程函數(shù):desc->thread = kthread_create(do_irqd,desc,“IRQ %d”,irq),irq為相應(yīng)中斷的中斷號。

  當(dāng)中斷發(fā)生時,系統(tǒng)調(diào)用do_IRQ()函數(shù),處理與架構(gòu)相關(guān)的部分,然后調(diào)用_do_IRQ()函數(shù)判斷中斷描述符的狀態(tài)字段是否包含SA_NODELAY標(biāo)志,若包含則該中斷已被線程化,喚醒相應(yīng)的中斷處理線程;反之則調(diào)用handle_IRQ_event()函數(shù)直接轉(zhuǎn)入中斷服務(wù)程序處理。

5結(jié)論

  本系統(tǒng)基于Linux軟件平臺和ARM硬件平臺,利用OpenCV視覺算法庫,在嵌入式系統(tǒng)上實(shí)現(xiàn)車牌識別。該系統(tǒng)與基于X86平臺的系統(tǒng)相比,實(shí)現(xiàn)了系統(tǒng)專用性、便攜性等特點(diǎn);與基于DSP平臺的系統(tǒng)相比,大大降低了成本。針對ARM平臺處理數(shù)字圖像系統(tǒng)實(shí)時性不足問題,提出多線程處理和中斷線程化方法,極大地提高了系統(tǒng)的實(shí)時性。實(shí)驗(yàn)結(jié)果表明,采用這種方法,從采集圖像到完成識別所用時間大大減少,系統(tǒng)執(zhí)行效率極大提高,完全能夠滿足實(shí)時處理數(shù)字圖像的需求。

參考文獻(xiàn)

 ?。?] 田紅鵬,焦鑫. 基于嵌入式Linux和OpenCV的車牌定位方法[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2014,35(11):39083911.

  [2] 郭建,孫青,黃霞. 基于圖像引導(dǎo)的自動導(dǎo)引小車系統(tǒng)設(shè)計(jì)[J]. 測控技術(shù),2012,31(7):3841.

  [3] MUKHOPADHYAY P,CHAUDHURI B B. A survey of Hough transform[J].Pattern Recognition,2015,48(3):9931010.

 ?。?] 孫首昌,韓紅芳,孟煜. 嵌入式Linux實(shí)時技術(shù)改進(jìn)與實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息,2007,23(122):6768.

 ?。?] 單承剛. 嵌入式Linux下的實(shí)時性增強(qiáng)方案[J]. 電子技術(shù)應(yīng)用,2010,36(7):137139.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。