李前汭,于力革
(江南大學 物聯(lián)網(wǎng)工程學院,無錫 214122)
隨著計算機技術和數(shù)字圖像處理技術的發(fā)展,機器視覺越來越廣泛運用于實際生活中,如通信領域、自動化生產(chǎn)等領域得到了越來越廣泛的應用.ARM嵌入式圖像處理技術相對于基于PC機等傳統(tǒng)的圖像處理系統(tǒng),其具有小巧、靈活、實時性強、便攜性好、低功耗、抗干擾強、程序固件化等優(yōu)點,得到了越來越廣泛應用.但也存在顯而易見的缺點,硬件方面如處理器的處理速度不夠快,以及主頻較低、緩存比較小、軟件方面設計難度大、開發(fā)難度高和專業(yè)性要求高等等.針對上述優(yōu)缺點,本文在研究ARM嵌入式系統(tǒng)原理的基礎上,設計了一種基于ARM Cortex-A9、OpenCV函數(shù)庫構建嵌入式圖像處理系統(tǒng)來實現(xiàn)對文字圖像的處理.該系統(tǒng)包括硬件平臺的構建和軟件架構設計,實現(xiàn)圖像的采集、顯示、存儲及處理.該系統(tǒng)采用Qt編程技術開發(fā)圖形應用程序,能實現(xiàn)圖像實時顯示和處理,從而縮短程序開發(fā)周期和降低開發(fā)難度.
本文硬件核心處理器是采用三星公司的基于ARM Cortex-A9 四核的 Exynos4412(Exynos4 Quad),主頻可達 1.6 GHz 處理器,并擁有雙通道 DDR3,處理器支持1Mbyte L2cache,具有可靠性高、穩(wěn)定性好等特點.同時平臺采用 64 MB SDRAM、64 MB NandFlash作為系統(tǒng)存儲器來存儲圖像的處理結果,LCD顯示觸摸屏顯示采集圖像和圖像處理過程及結果等[1].攝像頭選用的是與硬件開發(fā)平臺配套的Webeye2000 USB攝像頭來采集圖像.為了與PC機通信和向嵌入式平臺燒錄程序,平臺通過數(shù)據(jù)發(fā)送模塊、JTAG模塊以及串口和網(wǎng)線接口連接到上位PC機,組成了整個硬件開發(fā)平臺,這些硬件資源能夠滿足嵌入式文字識別系統(tǒng)的開發(fā).本文嵌入式圖像處理系統(tǒng)的硬件結構圖如圖1所示.
圖1 系統(tǒng)硬件結構圖
由于嵌入式平臺上可利用的資源有限,所以直接在平臺上很難完成軟件的開發(fā)和測試,因此,在嵌入式平臺上開發(fā)相關應用程序時,要構建交叉編譯環(huán)境,在PC機上完成相關程序開發(fā)和調(diào)試后,通過交叉編譯生成嵌入式平臺可執(zhí)行的文件.嵌入式圖像處理系統(tǒng)開發(fā)環(huán)境的構建主要包括Bootloader移植、操作系統(tǒng)的移植、攝像頭驅(qū)動配置、Tslib驅(qū)動移植和OpenCV的移植等.
對于嵌入式開發(fā)系統(tǒng)平臺構建的首要步驟是操作系統(tǒng)的選擇和移植.目前,嵌入式Linux操作系統(tǒng)作為嵌入式主流操作系統(tǒng),其最大的特點是源碼公開并且遵循GPL協(xié)議,同時嵌入式Linux操作系統(tǒng)支持廣泛的硬件,可以同各種強大的應用軟件及完善的設備驅(qū)動和開發(fā)工具融合.嵌入式Linux操作系統(tǒng)移植的關鍵在于制作根文件系統(tǒng)以啟動Linux內(nèi)核,制作根文件系統(tǒng)步驟如下:
(1)建立 rootfs目錄,并在該目錄下建立 root、home、lib、dev、shin、proc、 tmp、var、etc、usr等子目錄,并設置rootfs的可讀寫權限.
(2)編譯 busybox 文件,將生成的 bin、sbin、linuxrc、etc文件拷貝到rootfs,在dev里面建立新的結點 devA、devB.執(zhí)行 cramfsck -x rootfs rootfs.cramfs命令,生成 rootfs.ext4 根文件鏡像,將該文件拷入到開發(fā)板中,完成根文件系統(tǒng)的制作.
Bootloader是在目標板上電后,運行于操作系統(tǒng)之前的一段小程序,它的作用是引導加載應用程序.能夠用來初始化硬件配置、建立系統(tǒng)空間映像表,從而建相匹配的系統(tǒng)軟件和硬件環(huán)境[2],為最終調(diào)用嵌入式圖像處理平臺的Linux系統(tǒng)做好準備.修改Makefile文件,進行相關宏定義修改,主要步驟如下:
(1)添加交叉編譯庫include文件路徑到系統(tǒng)中,即:
(2)添加交叉編譯工具路徑,即:
(3)交叉編譯工具依賴文件,即:
進行上述配置后,執(zhí)行 make menuconfig 和make生成二進制文件并燒錄到開發(fā)板.
進入Linux內(nèi)核配置界面,依次選擇Device Drivers→Multimediac Surport→Video capture adapters→V4L USB devices→USB Video Class 便可完成攝像頭驅(qū)動模塊的加載配置.
內(nèi)核配置編譯完成后會生成zImage內(nèi)核鏡像文件,Bootloader會自動加載 zImage 到內(nèi)核,并跳轉到zImage開始地址運行.開發(fā)板上電,在Linux超級終端minicom命令行中輸入root命令,會啟動嵌入式平臺Linux操作系統(tǒng)出現(xiàn),啟動界面如圖2所示.
Tslib是用來校準電阻式觸摸屏開源軟件庫,可以為觸摸屏驅(qū)動獲得的采樣提供濾波、去抖、校準等功能,經(jīng)常用作觸摸屏驅(qū)動的適配層,在系統(tǒng)硬件的上層為應用提供接口.移植步驟如下文.
圖2 嵌入式平臺 Linux 啟動界面
(1)進入Tslib源碼目錄下,配置交叉編譯工具環(huán)境變量、生成路徑,進行編譯之前的配置,執(zhí)行命令:
(2)完成 tslib 交叉編譯后,進入 tslib/etc 目錄,配置文件 tslib.conf,把 module_raw_input前面的“#”和空格去掉.將tslib動態(tài)庫移植到嵌入式開發(fā)板,配置tslib在開發(fā)平臺上的環(huán)境變量.
Qt是一種跨平臺且面向?qū)ο蟮腃++圖形用戶界面應用程序開發(fā)框架.它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序.Qt使用一些特殊的代碼生成擴展以及一些宏,它易于擴展,允許組件編程.本文選用 Qt-4.8.5,其在Linux嵌入式平臺的移植步驟如下:
(1)進入 embedded Linux 版本 qt-everywhere
-opensource-src-4.8.5 源碼目錄下,執(zhí)行命令,進行編譯之前的配置,添加交叉編譯工具inux-arm環(huán)境路徑、添加-embedded arm指定對arm平臺embedded版本、添加-qt-mouse-tslib和tislib的lib庫路徑為了指定使用tslib來驅(qū)動觸摸屏.
(2)編輯文件 mkspecs/qws/linux-arm-g++/
qmake.conf,添加 tslib 動態(tài)庫,將 QMAKE_CC、QMAKE_CXX、QMAKE_LINK、QMAKE_LINK_SHLIB 的 arm-none-linux-gnueabi-gcc/g++后添加-lts,將 QMAKE_AR、QMAKE_OBJCOPY、QMKE_STRIP 的 arm-none-linux-gnueabi-后面分別添加-ar cqs、-objcopy、-strip.
(3)在終端 make 和 make install后,將經(jīng)過交叉編譯得到的lib庫拷貝到嵌入式平臺的根目錄下,配置Qt庫在開發(fā)平臺環(huán)境變量.
OpenCV提供了大量的圖像處理算法函數(shù),開發(fā)者可以在圖像處理程序中直接調(diào)用算法并進行移植,可以減少繁雜的開發(fā)任務.本文移植的視覺庫是OpenCV-2.4.9,移植步驟如下:
(1)下載和安裝cmake-gui.它是跨平臺交叉編譯工具,能夠生成makefile文件.
(2)下載安裝OpenCV-2.4.9.下載完成后解壓到/root/tools 目錄下,切換到 root用戶下,輸入#cmakegui打開cmake圖形界面,輸入OpenCV的源碼路/root/tools/ OpenCV-2.4.9 和安裝路徑/user/local/armopencvlib,點擊 configure 和 next按鈕后,添加C/C++交叉編譯工具,并勾上 BUILD_JPEG、BUILD_PNG,取消安裝 tiff,修改 CMAKE_INSTALL_PREFIX 值,點擊 Generate 按鈕生成 Makefile 文件.進入到 arm-opencvlib目錄下CmakeCache.txt文件,在CMAKE_EXE_LINKER_FLAGS:STRING=后加上-lpthread –lrt;在終端輸入 make 和 make install完成OpenCV-2.4.9編譯安裝.
(3)進入arm-OpenCV目錄,將編譯連接得到的lib、include、share文件拷貝到開發(fā)板的/user/local目錄下,并配置嵌入式板的OpenCV庫的環(huán)境路徑.
本文設計了對漢英混排字符文本文檔圖像的字符識別程序,文字識別處理流程如圖3所示.
圖3 文字識別處理流程
由于在圖像的獲取過程中,拍攝的角度及相機的振動和拍攝的高低遠近變化無常,再加上光線的變化,本身曝光時間,這些因素都會影響所采集圖像的質(zhì)量.為了使在后續(xù)對圖像中信息更好識別獲取,必須使區(qū)域特征更加突出,目標信息更加明顯,故在對圖像進行信息識別之前,需要經(jīng)過一系列的預處理來對圖像進行補償[3],以減少識別的錯誤率.圖像預處理工作依次為對采集到的圖像進行圖像去噪、灰度化處理、邊緣處理、圖像二值化等.
為了在去噪過程中,不損壞圖像中字符的輪廓和邊緣等信息,本文采用了中值濾波法進行濾波,在消除噪聲的同時不破壞圖像的細節(jié).在灰度化處理方面,本文選擇顏色通道的最大值作為灰度值,即:
其中,W、H為圖像的寬和高.
另外,采用Sobel算子進行文字的邊緣檢測,OTSU算法進行圖像的二值化,預處理效果如圖4所示.
圖4 預處理效果
在預處理完成后,利用文本圖像版面一些特點,首先采用水平投影進行行分割,其次基于字符連通域的方法對二值圖像進行字符連通域標記[4,5],以及將中文區(qū)域和英文區(qū)域進行分離,最后已分割出來文字進行合并和粘連分割,處理步驟如下:
(1)行分割 對于印刷字體來說,一般行界區(qū)分都很明顯,即文本圖像行與行之間的空白空隙是固定的,而且要小于字符行的高度,為了更好的處理,可以通過檢測空白區(qū)域,可以確定圖像中的各行邊界,本文根據(jù)這一特征采用水平的投影算法[6]來進行行割.目前,對文本字符分割采用投影法效果明顯.它是把圖像具體化為一個A×B的矩陣f(i,j),對每一行的投影算法如下:
其中,投影值為0的點是字符間的空白.將第一個V(j)≠0 的點標記為Va,并從Va開始,分割程序從上到下或從左到右掃描每一行或列,當?shù)诙斡龅絍(j)=0 的點時,將該點標記為Vb,此時掃描停止,這兩點之間視為一行字符,使用這種方法循環(huán)至行的結尾.
(2)字符連通域標記 在完成行分割后,就可以進行字符分割.除了行與行之間,在同一行中的字符之間也是存在空白的,可以利用這些空白,可以確定字符之間的邊界.可以利用該特性,對圖像不同行區(qū)域的字符進行連通域標記,并定義連通域類如下:
對文本進行初步切分,大多數(shù)文字可以被切分出來,但仍然有少許文字不能被正確切分出來,如左右結構漢字、上下結構漢字、粘連字符和交叉包含結構的字符會形成獨自連通域,如圖5所示,因而對初步切分結果進行合并處理是很有必要的[7].經(jīng)過試驗表明,采取以下幾個步驟能夠較為有效地切分出各文字.
圖5 連通域初步標記及初步切分
1)區(qū)域分割:根據(jù)文本圖像中同一水平線上,同類文字之間中心間距是均勻且固定的,因此可以利用這種特性來判斷一些字符是否為英文字符或中文字符[8,9].但是當不同類文字混合出現(xiàn)在一行的時候,對等間距性產(chǎn)生破壞[10].文本中英文字符的長和寬遠遠小于中文字符,可以利用字符的長和寬特性來分離出中英文字符區(qū)域[11].因為英文字符和數(shù)字字符有類似的寬度和周期,所以本文在區(qū)域分離的時候,將數(shù)字考慮在英文區(qū)域內(nèi).但是對于標點符號來說,其長寬比相對來說要小很多,可以依此快速分離出標點符號.
2)字符合并:首先對連通域進行行排列,以連通域的中心點為特征,對每行的連通域按照中心點列坐標進行排序.其次,合并分兩步進行,根據(jù)上下結構和交叉包含連通域的中心點的橫縱坐標都在最大連通域的范圍內(nèi),將完全包含關系和上下結構關系的連通域合并[12].最后,以連通域中心點為中心,以m倍×平均字寬作為搜索半徑進行左右搜索;如果合并后的字寬不超過n倍×平均字寬,則進行合并(其中m、n為系數(shù)),并結合左右結構字符的內(nèi)部間隙小于字與字之間的距離進行合并.
3)粘連分割:首先,求解平均字寬.由于連通域大多是已經(jīng)切分正確的文字,因而可以通過統(tǒng)計連通域的寬度來得到一個參考的平均字寬[13].為了使得統(tǒng)計的平均字寬更接近真值,需要舍棄或合并某些連通域進行多次平均求解,會得到接近實際的平均字寬.其次,為了使粘連的字符或部件分離,掃描結點,判斷連通域的寬度是否超過平均字寬一定程度.如果超過,則返回到層次連通域表中上一個層次得到多個連通域.合并和粘連切分如圖6所示.
圖6 合并處理與粘連切分
由于漢字數(shù)量較大,本文選取了200個宋體漢字作為訓練樣本,100個宋體漢字作為測試樣本.分別訓練常用漢字、英文和標點模板,形成樣本庫.具體步驟如下:首先將輸入只有單個字符的圖像,進行中值濾波、二值化、歸一化和特征提取等處理;然后把提取出來的特征向量值存入自動生成的HOG_SVM_CHIN.xml、HOG_SNM_DATA.xml、HOG_SVM_CHAR.xml文件.最后文件的命名時把手動輸入指定的字符轉化為對應的微軟標準編碼作為文件的名字,后綴名為.xml數(shù)據(jù)文件,并把文件保存在指定的路徑下.
(1)tslib 測試,把 tslib.tar.gz 拷貝到開發(fā)平臺,并解壓到/media/inand_ext4_1目錄下,運行ts_calibrate觸摸校準程序,觸摸校準完成后會在/etc目錄下生成pointercal文件.接著可以運行其他命令(ts_harvest 、ts_print、ts_print_raw、ts_test)進行觸摸測試.
(2)Qt測試,把 QtEmbedded-4.8.5-arm.tar.gz 拷貝到開發(fā)平臺,解壓到/media/inand_ext4_1 目錄下,進入/media/inand_ext4_1/QtEmbedded-4.8.5-arm/demos/embedded/fluidlauncher,運行 fluidlauncher啟動器程序,觸摸屏上將啟動Qt圖形界面,并且可以用觸摸操作.
(3)編寫開機運行Tslib和Qt啟動腳本,讓系統(tǒng)開機就自動運行Qt圖形界面程序,需要在系統(tǒng)的啟動文件里加上執(zhí)行指令,修改文件文件/usr/etc/rc.local.
(4)在平臺下安裝 Qt插件庫,在/usr/local下安裝支持jpeg、png等圖片格式的插件庫.
(5)將已經(jīng)訓練好的字符庫.xml文件拷貝到嵌入式平臺的/bin/目錄下.
(6)程序移植,完成字符處理程序設計后,使用交叉編譯器對已經(jīng)調(diào)試好的源程序編譯,生成可以在開發(fā)平臺運行的可執(zhí)行文件QTlmage,并將該文件移植到開發(fā)平臺下的/bin/目錄.
啟動系統(tǒng),應用程序自動運行,在嵌入式平臺上看到程序運行效果如圖7所示.
圖7 嵌入式平臺 OCR 字符識別效果
本文研究了基于嵌入式平臺混合字符識別系統(tǒng),給出了嵌入式系統(tǒng)開發(fā)環(huán)境的構建步驟,主要包括:Bootloader移植、攝像頭驅(qū)動配置、Tslib驅(qū)動移植和OpenCV的移植等,開發(fā)了基于ARM Cortex-A9嵌入式圖像字符識別程序,并將程序移植到嵌入式平臺運行,從運行結果可知,編譯程序已經(jīng)在嵌入式平臺正常運行,移植的OpenCV和Qt嵌入式圖像處理系統(tǒng)具有較高的穩(wěn)定性和可行性,同時該系統(tǒng)也能對圖像字符進行很好的分割和識別.但在拍攝圖片時,圖片的質(zhì)量受多種因素的干擾,字符分割時有時會產(chǎn)生錯誤,導致識別出現(xiàn)誤差.因此,下一步還需要改進算法,來提高字符的識別.