徐弘揚(yáng)
(合肥工業(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院,安徽 合肥 230009)
?
基于嵌入式Linux的卡口車輛檢測系統(tǒng)設(shè)計(jì)
徐弘揚(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ū)動(dòng)開發(fā)。針對在ARM平臺上處理數(shù)字圖像數(shù)據(jù)量大、耗時(shí)長的情況,提出了多線程處理模式和中斷線程化方法,極大地提高了系統(tǒng)的實(shí)時(shí)性。
關(guān)鍵詞:嵌入式Linux;OpenCV;車牌識別;多線程;中斷線程化
引用格式:徐弘揚(yáng). 基于嵌入式Linux的卡口車輛檢測系統(tǒng)設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2016,35(12):87-89.
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ò)通信模塊組成。總體結(jié)構(gòu)框圖如圖1所示。
圖1 系統(tǒng)總體框架圖
紅外對射模塊檢測等待區(qū)是否有車輛,如有車輛停放,發(fā)送信號給處理器,并啟動(dòng)攝像頭采集圖像[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)行的代碼。
(1)安裝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.2U-boot移植
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ò)通信,所以需要在板級配置文件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ū)動(dòng)移植
U-boot中并沒有實(shí)現(xiàn)針對S3C6410 SD/MMC控制器的驅(qū)動(dòng)程序,需要自行添加代碼,實(shí)現(xiàn)SD卡的初始化、命令處理、塊設(shè)備讀等操作。
驅(qū)動(dòng)文件sd_driver.c中,函數(shù)sd_init()實(shí)現(xiàn)SD卡初始化,它首先對SD/MMC主控制器時(shí)鐘、中斷等進(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ū)動(dòng)移植
本系統(tǒng)采用USB接口的圖像采集模塊,為使該模塊正常工作,需要移植USB驅(qū)動(dòng)。U-boot中已經(jīng)實(shí)現(xiàn)了較完整的主機(jī)OHCI驅(qū)動(dòng),但沒有USB設(shè)備驅(qū)動(dòng)的代碼,所以需要添加這部分代碼。
在板級配置文件My6410.h中進(jìn)行相應(yīng)配置,使U-boot支持USB設(shè)備驅(qū)動(dòng)、USB主機(jī)驅(qū)動(dòng)及命令和USB存儲(chǔ)設(shè)備,并在include/s3c6410.h中完善對S3C6410 USB OTG控制器寄存器的定義。
3車輛圖像處理
對于攝像頭采集的車輛圖像處理主要分為3個(gè)步驟:車牌定位、字符分割和字符識別。其中,車牌定位是整個(gè)處理過程的基礎(chǔ),其定位的準(zhǔn)確與否直接影響到車牌的字符分割和識別效果。圖2給出車牌定位的一般流程。
圖2 車牌定位一般流程
從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)行傾斜校正,然后將車牌字符在垂直方向上投影,字符之間的間隙會(huì)在投影上產(chǎn)生低谷,從而實(shí)現(xiàn)字符分割。分割完成后,對各個(gè)字符進(jìn)行識別,采用基于模板匹配的ORC算法,將字符尺寸縮放至與SD卡中存儲(chǔ)的模板大小一致并匹配,得出最佳的匹配結(jié)果。
4系統(tǒng)實(shí)時(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í)時(shí)性還有待提高。
4.1多線程處理
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分配的基本單元,它不擁有系統(tǒng)資源,但可與同一進(jìn)程中的其他線程共享該進(jìn)程的所有資源。本系統(tǒng)采用多線程處理方法,主程序中創(chuàng)建4個(gè)線程,分別用于圖像采集、圖像解壓、灰度化和網(wǎng)絡(luò)通信。圖像采集線程從圖像傳感器中讀取圖像信息,圖像解壓線程利用libjpeg庫將讀取到的JPEG圖像轉(zhuǎn)換為BMP圖像,灰度化線程對得到的BMP圖像進(jìn)行灰度化處理,網(wǎng)絡(luò)通信線程用于將讀取到的圖像發(fā)送給服務(wù)器。為此,還要?jiǎng)?chuàng)建兩個(gè)FIFO,用于線程間的資源共享,第一個(gè)FIFO用來存放圖像采集線程讀取到的圖像信息,可被圖像解壓線程和網(wǎng)絡(luò)通信線程共享;第二個(gè)FIFO用來存放解壓后的圖像數(shù)據(jù),用于灰度化線程的處理。這4個(gè)線程并發(fā)執(zhí)行,大大提高了CPU的利用率和處理速度,便于實(shí)時(shí)控制。
得到灰度化圖像之后,還需對圖像進(jìn)行進(jìn)一步處理,如果按照“邊緣檢測—二值化—形態(tài)學(xué)濾波”的步驟執(zhí)行,則耗時(shí)太長,不利于提高系統(tǒng)實(shí)時(shí)性。這里開啟3個(gè)線程,分別用于邊緣檢測、二值化和形態(tài)學(xué)濾波。由于這3個(gè)線程執(zhí)行過程中有依賴關(guān)系,因此還要?jiǎng)?chuàng)建兩個(gè)FIFO,分別用于存放邊緣檢測后的圖像數(shù)據(jù)和二值化后的圖像數(shù)據(jù)。改進(jìn)后的車牌定位流程圖如圖3所示。
圖3 改進(jìn)的車牌定位流程圖
4.2中斷線程化
在Linux標(biāo)準(zhǔn)內(nèi)核中,中斷是最高優(yōu)先級的執(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)采用中斷線程化方式,為中斷創(chuàng)建線程,中斷作為內(nèi)核線程被賦予相應(yīng)的優(yōu)先級,該優(yōu)先級可以低于對實(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)核線程,并分配優(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ā)生時(shí),系統(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í)時(shí)性不足問題,提出多線程處理和中斷線程化方法,極大地提高了系統(tǒng)的實(shí)時(shí)性。實(shí)驗(yàn)結(jié)果表明,采用這種方法,從采集圖像到完成識別所用時(shí)間大大減少,系統(tǒng)執(zhí)行效率極大提高,完全能夠滿足實(shí)時(shí)處理數(shù)字圖像的需求。
參考文獻(xiàn)
[1] 田紅鵬,焦鑫. 基于嵌入式Linux和OpenCV的車牌定位方法[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2014,35(11):3908-3911.
[2] 郭建,孫青,黃霞. 基于圖像引導(dǎo)的自動(dòng)導(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.
[4] 孫首昌,韓紅芳,孟煜. 嵌入式Linux實(shí)時(shí)技術(shù)改進(jìn)與實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息,2007,23(12-2):67-68.
[5] 單承剛. 嵌入式Linux下的實(shí)時(shí)性增強(qiáng)方案[J]. 電子技術(shù)應(yīng)用,2010,36(7):137-139.
中圖分類號:TP391.4
文獻(xiàn)標(biāo)識碼:A
DOI:10.19358/j.issn.1674- 7720.2016.12.028
(收稿日期:2016-02-23)
作者簡介:
徐弘揚(yáng)(1992-),通信作者,男,碩士研究生,主要研究方向:嵌入式開發(fā)。E-mail:hongyang_xu@163.com。
Detecting system of intersection vehicles based on embedded Linux
Xu Hongyang
(School of Computer and Information, Hefei University of Technology, Hefei 230009, China)
Abstract:The system uses OpenCV and cross compiling to process image and identify license plate, and based on hardware platform of Samsung S3C6410 processor and software platform of Linux system, completes driver design of SD module and network module. In regard of massive data and timeout in processing digital image on ARM platform, the system proposes multiple threads and interrupt threading to enhance real-time.
Key words:embedded Linux; OpenCV; license plate identification; multiple threads; interrupt threading