徐弘揚
(合肥工業大學 計算機與信息學院,安徽 合肥 230009)
?
基于嵌入式Linux的卡口車輛檢測系統設計
徐弘揚
(合肥工業大學 計算機與信息學院,安徽 合肥 230009)
摘要:系統以三星處理器S3C6410為硬件平臺,Linux操作系統為軟件平臺,利用OpenCV視覺算法庫和交叉編譯環境,在ARM平臺上進行圖像處理與車牌識別,并完成了SD卡模塊、網絡模塊和圖像采集模塊的驅動開發。針對在ARM平臺上處理數字圖像數據量大、耗時長的情況,提出了多線程處理模式和中斷線程化方法,極大地提高了系統的實時性。
關鍵詞:嵌入式Linux;OpenCV;車牌識別;多線程;中斷線程化
引用格式:徐弘揚. 基于嵌入式Linux的卡口車輛檢測系統設計[J].微型機與應用,2016,35(12):87-89.
0引言
與基于X86平臺的傳統圖像處理系統相比,嵌入式系統具有專用性強、處理速度快、軟硬件可裁剪等優點[1]。本文基于ARM平臺和OpenCV視覺算法庫,采用多線程處理模式和中斷線程化方法,實現對車牌圖像的快速處理與識別。
1系統總體設計
本系統主要由S3C6410處理器、圖像采集模塊、紅外對射模塊、SD卡模塊和網絡通信模塊組成。總體結構框圖如圖1所示。

圖1 系統總體框架圖
紅外對射模塊檢測等待區是否有車輛,如有車輛停放,發送信號給處理器,并啟動攝像頭采集圖像[2];SD卡模塊用于存放車牌字符的模板庫,處理器識別出車牌號并與SD卡中的字符模板進行匹配;網絡通信模塊將車輛圖像信息直接上傳給服務器。
2Linux平臺搭建
2.1OpenCV移植
考慮到圖像處理算法設計難度大、開發周期長、代碼效率低等問題,本系統在Linux開發環境下,調用成熟高效的OpenCV函數庫,利用交叉編譯,生成在目標機上可運行的代碼。
(1)安裝OpenCV依賴庫
OpenCV依賴于libpng、libjpeg、libstdcpp、libpthread等庫,而這些庫又依賴于其他一些庫文件,所有需依賴的庫都要編譯安裝。
(2)配置OpenCV
進入OpenCV根目錄,運行./config,對OpenCV進行配置:--host=arm-linux指定交叉編譯為ARM平臺;--enable-static表示生成靜態庫。
2.2U-boot移植
Bootloader是系統上電/復位后,內核啟動程序之前的一小段代碼,其功能是初始化硬件設備,并將操作系統內核裝載到RAM中運行。U-boot作為一個主流、通用的Bootloader,被成功移植到包括PowerPC、ARM、X86、MIPS等多種體系結構的處理器上。
2.2.1網卡驅動移植
系統采用DM9000網卡控制器進行網絡通信,所以需要在板級配置文件My6410.h中屏蔽掉原有的cs8900配置,并添加對DM9000的支持。
要使掛接在BANK1上的DM9000正常工作,需要配置SROM控制器相關的寄存器。在板級初始化文件My6410.c中,添加DM9000初始化函數dm9000_init(),并修改寄存器SROM_BCn相應位值。
#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卡驅動移植
U-boot中并沒有實現針對S3C6410 SD/MMC控制器的驅動程序,需要自行添加代碼,實現SD卡的初始化、命令處理、塊設備讀等操作。
驅動文件sd_driver.c中,函數sd_init()實現SD卡初始化,它首先對SD/MMC主控制器時鐘、中斷等進行初始化,然后通過主控制器向SD卡發送命令,命令操作通過函數sd_cmd()實現。SD卡讀操作函數sd_read用于從SD卡中將源地址從src開始,大小為size的數據讀取到dst指定的地址中。sd_read函數原型為:
sd_read(src,dst,blkcnt *sd_block_size)
2.2.3USB驅動移植
本系統采用USB接口的圖像采集模塊,為使該模塊正常工作,需要移植USB驅動。U-boot中已經實現了較完整的主機OHCI驅動,但沒有USB設備驅動的代碼,所以需要添加這部分代碼。
在板級配置文件My6410.h中進行相應配置,使U-boot支持USB設備驅動、USB主機驅動及命令和USB存儲設備,并在include/s3c6410.h中完善對S3C6410 USB OTG控制器寄存器的定義。
3車輛圖像處理
對于攝像頭采集的車輛圖像處理主要分為3個步驟:車牌定位、字符分割和字符識別。其中,車牌定位是整個處理過程的基礎,其定位的準確與否直接影響到車牌的字符分割和識別效果。圖2給出車牌定位的一般流程。

圖2 車牌定位一般流程
從OpenCV函數庫角度來說,調用cvCvtColor函數對彩色圖像進行灰度化處理;利用Soble算子對圖像進行垂直方向的邊緣檢測;再對圖像進行閾值分割,取合適的閾值,將圖像轉換為二值圖像;為了消除圖像噪聲,還要對其進行濾波操作,本系統采用的是形態學濾波方法,先使用閉運算操作再使用開運算操作,兩種運算都包含腐蝕與膨脹;形態學運算后得到少部分矩形區域,即為車牌的候選區域,可以使用cvFindContours函數來實現輪廓檢測,然后根據我國車牌長寬比的特征,即44:14,定位車牌區域。
車牌區域提取出來后,要將車牌字符分割,由于可能存在車牌傾斜的情況,導致字符分割與識別不準確,因此要先使用Hough算法[3]對車牌進行傾斜校正,然后將車牌字符在垂直方向上投影,字符之間的間隙會在投影上產生低谷,從而實現字符分割。分割完成后,對各個字符進行識別,采用基于模板匹配的ORC算法,將字符尺寸縮放至與SD卡中存儲的模板大小一致并匹配,得出最佳的匹配結果。
4系統實時性改進
本系統采用三星S3C6410處理器,該CPU基于ARM1176JZF-S內核,由8級流水線組成,主頻可達522 MHz,最高可達667 MHz,但由于在ARM平臺上處理數字圖像數據量大、過程復雜的特點,系統實時性還有待提高。
4.1多線程處理
線程是進程的一個實體,是CPU調度和分配的基本單元,它不擁有系統資源,但可與同一進程中的其他線程共享該進程的所有資源。本系統采用多線程處理方法,主程序中創建4個線程,分別用于圖像采集、圖像解壓、灰度化和網絡通信。圖像采集線程從圖像傳感器中讀取圖像信息,圖像解壓線程利用libjpeg庫將讀取到的JPEG圖像轉換為BMP圖像,灰度化線程對得到的BMP圖像進行灰度化處理,網絡通信線程用于將讀取到的圖像發送給服務器。為此,還要創建兩個FIFO,用于線程間的資源共享,第一個FIFO用來存放圖像采集線程讀取到的圖像信息,可被圖像解壓線程和網絡通信線程共享;第二個FIFO用來存放解壓后的圖像數據,用于灰度化線程的處理。這4個線程并發執行,大大提高了CPU的利用率和處理速度,便于實時控制。
得到灰度化圖像之后,還需對圖像進行進一步處理,如果按照“邊緣檢測—二值化—形態學濾波”的步驟執行,則耗時太長,不利于提高系統實時性。這里開啟3個線程,分別用于邊緣檢測、二值化和形態學濾波。由于這3個線程執行過程中有依賴關系,因此還要創建兩個FIFO,分別用于存放邊緣檢測后的圖像數據和二值化后的圖像數據。改進后的車牌定位流程圖如圖3所示。

圖3 改進的車牌定位流程圖
4.2中斷線程化
在Linux標準內核中,中斷是最高優先級的執行單元,當中斷觸發時,內核必須立即響應中斷并執行響應的中斷處理程序,且不會被其他任何程序打斷,這會導致實時任務得不到及時處理,如果系統IO負載嚴重,中斷會非常頻繁,實時任務很難有機會運行[4]。本系統采用中斷線程化方式,為中斷創建線程,中斷作為內核線程被賦予相應的優先級,該優先級可以低于對實時性要求更高的任務,確保實時任務被優先快速執行,提高系統實時性[5]。
具體實現方法為:在內核初始化函數init()中調用init_hardirqs()函數,為相應中斷創建一個內核線程,并分配優先級。本系統中主要有3種中斷:SD卡傳輸中斷、網絡傳輸中斷和OTG中斷。
創建中斷線程函數:desc->thread = kthread_create(do_irqd,desc,“IRQ %d”,irq),irq為相應中斷的中斷號。
當中斷發生時,系統調用do_IRQ()函數,處理與架構相關的部分,然后調用_do_IRQ()函數判斷中斷描述符的狀態字段是否包含SA_NODELAY標志,若包含則該中斷已被線程化,喚醒相應的中斷處理線程;反之則調用handle_IRQ_event()函數直接轉入中斷服務程序處理。
5結論
本系統基于Linux軟件平臺和ARM硬件平臺,利用OpenCV視覺算法庫,在嵌入式系統上實現車牌識別。該系統與基于X86平臺的系統相比,實現了系統專用性、便攜性等特點;與基于DSP平臺的系統相比,大大降低了成本。針對ARM平臺處理數字圖像系統實時性不足問題,提出多線程處理和中斷線程化方法,極大地提高了系統的實時性。實驗結果表明,采用這種方法,從采集圖像到完成識別所用時間大大減少,系統執行效率極大提高,完全能夠滿足實時處理數字圖像的需求。
參考文獻
[1] 田紅鵬,焦鑫. 基于嵌入式Linux和OpenCV的車牌定位方法[J]. 計算機工程與設計,2014,35(11):3908-3911.
[2] 郭建,孫青,黃霞. 基于圖像引導的自動導引小車系統設計[J]. 測控技術,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實時技術改進與實現[J]. 微計算機信息,2007,23(12-2):67-68.
[5] 單承剛. 嵌入式Linux下的實時性增強方案[J]. 電子技術應用,2010,36(7):137-139.
中圖分類號:TP391.4
文獻標識碼:A
DOI:10.19358/j.issn.1674- 7720.2016.12.028
(收稿日期:2016-02-23)
作者簡介:
徐弘揚(1992-),通信作者,男,碩士研究生,主要研究方向:嵌入式開發。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