史秉政
(南京航空航天大學(xué) 信息科學(xué)與技術(shù)學(xué)院,南京 210016)
隨著智能手機(jī)處理能力及手機(jī)攝像頭分辨率的快速提高,手機(jī)二維條碼的應(yīng)用也越來越廣。手機(jī)既可以作為二維條碼的載體,比如用戶可以接收到服務(wù)商發(fā)送來的二維條碼,再到實(shí)際消費(fèi)場(chǎng)所以此作為憑證,進(jìn)行消費(fèi);也可以作為二維條碼的解碼設(shè)備,對(duì)印刷在商品包裝上的二維條碼進(jìn)行解碼識(shí)別,得到商品相應(yīng)的信息。目前,二維條碼在國外一些發(fā)達(dá)國家已經(jīng)有了很廣泛的應(yīng)用,在我國還處于發(fā)展階段。中國移動(dòng)已經(jīng)正式推出了二維條碼的業(yè)務(wù),可以預(yù)見,手機(jī)二維條碼必將在我國發(fā)展成為重要的移動(dòng)增值業(yè)務(wù)。
DM碼(DataMatrix Code),原名Datacode,是由美國國際資料公司(International Data Matrix)于1989年發(fā)明的。DataM atrix二維條碼是一種矩陣式二維條碼,其發(fā)展構(gòu)想是希望在較小的條碼上存入更多的數(shù)據(jù)。DataMatrix二維條碼的最小尺寸是目前所有條碼中最小的,特別適合于小零件的識(shí)別,以及直接印刷在實(shí)體上。
DataMatrix采用了復(fù)雜的糾錯(cuò)碼技術(shù),使得該編碼具有超強(qiáng)的抗污染能力,即使編碼部分破損,也不會(huì)影響讀出全部信息。它有兩種類型,即ECC 000-140和ECC200。ECC 000-140具有幾種不同等級(jí)(ECC 050、ECC 080、ECC 100、ECC 140)的卷積錯(cuò)誤糾正功能 ;而ECC 200是通過Reed-Solomon糾錯(cuò)算法實(shí)現(xiàn)糾錯(cuò)功能。對(duì)于新的應(yīng)用,推薦使用ECC 200,本文也以 ECC 200為對(duì)象。
本文實(shí)現(xiàn)了基于Symbian平臺(tái)的DM碼的識(shí)別系統(tǒng)。測(cè)試表明,本系統(tǒng)可以正確、快速地識(shí)別DM 碼。
每個(gè)DataMatrix二維條碼符號(hào)由規(guī)則排列的方形模組構(gòu)成的資料區(qū)組成,資料區(qū)的四周由定位圖形(Finder Pattern)所包圍,定位圖形的四周則由空白區(qū)包圍,資料區(qū)再以排位圖形(alignment pattern)加以分隔。
定位圖形是資料區(qū)域的一個(gè)邊界,為一個(gè)模組寬度。其中兩條鄰邊為暗實(shí)線,主要用于限定物理尺寸,定位和符號(hào)失真。另兩條鄰邊由交替的深色和淺色模組組成,主要用于限定符號(hào)的單元結(jié)構(gòu),但也能幫助確定物理尺寸及失真,如圖1所示。
圖1 Data Matrix圖形結(jié)構(gòu)
識(shí)別過程是對(duì)DM碼進(jìn)行解碼的前期步驟,其基本步驟如下:
①圖像灰度化?;叶然袃煞N常見的算法:第1種是標(biāo)準(zhǔn)灰度化計(jì)算公式W=0.30R+0.59G+0.11B,第2種是最大值灰度化公式W=max(R,G,B)。設(shè)某像素的RGB的彩色各分量值為(R,G,B),其中0≤R,G,B≤255,W為灰度轉(zhuǎn)換結(jié)果,max用于求取最大值??紤]到嵌入式設(shè)備得到的待解碼圖像多為黑白顏色,為了能夠以更快的速度進(jìn)行灰度化,并減少系統(tǒng)的運(yùn)算量,這里采用第2種方法的改進(jìn)公式W=G來進(jìn)行灰度化。
②圖像濾波。條碼圖像的噪聲一般來自于嵌入式設(shè)備的光學(xué)采集系統(tǒng)。這種噪聲是滿足泊松分布的椒鹽噪聲,可以用適當(dāng)大小的中值濾波來進(jìn)行處理。
③圖像增強(qiáng)。由于圖像可能存在高光區(qū)、陰影等缺陷,可以在二值化之前進(jìn)行同態(tài)濾波,以此將圖像亮度范圍壓縮,并將圖像對(duì)比度增強(qiáng),可以得到比較滿意的圖像增強(qiáng)效果,有利于二值化操作。
④灰度圖像二值化處理。這里使用Ostu算法[1]計(jì)算出一個(gè)全局閾值T1,以此作為二值化的閾值。
⑤在得到的二值圖像上進(jìn)行對(duì)DM碼定位圖形的檢測(cè),定位圖形就是左邊與下邊的直線連在一起形成的“L”邊。關(guān)鍵是對(duì)直線的檢測(cè)。
首先通過Sobel算子,將二維條碼圖像進(jìn)行邊緣提取。然后根據(jù)Freeman準(zhǔn)則進(jìn)行直線檢測(cè)。
Freeman直線檢測(cè)的3條準(zhǔn)則如下:
a.一條數(shù)字直線的8鄰域鏈碼中最多包括兩個(gè)方向,其中一個(gè)為主方向。它是決定直線方向的主要因素。
b.這兩個(gè)方向的鏈碼值相差1(mod8)。
c.主方向上鏈碼值相同的連續(xù)像素組成一個(gè)線段子元,除去第一個(gè)和最后一個(gè)線段子元,其余各線段子元的長度至多相差一個(gè)像素。
對(duì)檢測(cè)到的直線段,采用以下準(zhǔn)則判斷是否是條碼的“L”定位圖形:
a.兩直線段夾角在90°附近時(shí)判斷兩線段夾角準(zhǔn)則如下:設(shè)線段1中起始像素坐標(biāo)為(X1,Y1),終止像素坐標(biāo)為(X2,Y2);線段2中起始像素坐標(biāo)為(X3,Y3),終止像素坐標(biāo)為(X4,Y4),則線段1的斜率K1=(Y2-Y1)/(X2-X1),線段 2的斜率 K2=(Y4-Y3)/(X4-X3),兩線段之間的偏轉(zhuǎn)角度θ=arctg(|(K2-K1)/(1+K2K1)|)。
由于存在透視效果,若|90°-θ|≤α(α為閾值,一般α∈[0,20°])成立,則兩線段近似認(rèn)為是垂直線段。
b.DataMatrix條碼的“L”定位圖像有交點(diǎn),因此判斷兩直線是否具有相同或相近交點(diǎn)。
c.由于DataMatrix條碼的特點(diǎn),一般長寬比不超過3,因此判斷兩直線段長度比在1~3之間。
將符合以上準(zhǔn)則的直線段作為候選“L”邊,過濾其他不符合條件的直線段。
⑥通過得到DM碼定位圖形,可以將DM碼旋轉(zhuǎn)至水平位置,并將DM碼分割出來。
通過以上步驟完成DM碼的識(shí)別。
DM碼解碼基本步驟如下:
a.識(shí)別格式信息,完成對(duì)格式信息模塊的糾錯(cuò)和識(shí)別。
b.識(shí)別版本信息,確定DM 碼的版本。
c.消除掩膜。
d.根據(jù)模塊排列規(guī)則,識(shí)別符號(hào)字符,得到信息和糾錯(cuò)碼字。
e.用得到的糾錯(cuò)碼字對(duì)識(shí)別得到的信息進(jìn)行錯(cuò)誤檢測(cè),如發(fā)現(xiàn)錯(cuò)誤則進(jìn)行糾錯(cuò)。
f.按照所使用的模式譯碼得出數(shù)據(jù)字符,并輸出結(jié)果。
目前,主流的智能手機(jī)操作系統(tǒng)有3種:Symbian、Windows Mobile和Linux。其中Symbian以其平臺(tái)的開放性、較低的授權(quán)費(fèi)用、眾多廠商的支持、對(duì)硬件要求低、第三方軟件豐富等優(yōu)勢(shì),成為智能手機(jī)市場(chǎng)上應(yīng)用最為廣泛的產(chǎn)品。Symbian是一個(gè)實(shí)時(shí)、多任務(wù)的純32位操作系統(tǒng),具有功耗低、內(nèi)存占用少等特點(diǎn),非常適合手機(jī)等移動(dòng)設(shè)備使用,經(jīng)過不斷完善,可以支持GPRS、藍(lán)牙、SyncML以及3G技術(shù)。最重要的是,它是一個(gè)標(biāo)準(zhǔn)化的開放式平臺(tái),任何人都可以為支持Symbian的設(shè)備開發(fā)軟件。Symbian操作系統(tǒng)融合了許多功能強(qiáng)大、成熟穩(wěn)定的技術(shù),其中包括豐富的應(yīng)用引擎、移動(dòng)電話技術(shù)、安全性、多媒體、支持多種應(yīng)用界面、通信協(xié)議、軟件開發(fā)(Java和C++)等。
根據(jù)不同的終端產(chǎn)品在屏幕尺寸、用戶輸入方式等方面的差異,Symbian給出了用戶界面風(fēng)格的3種參考設(shè)計(jì)——Pearl、Crystal和Quartz,最終演變?yōu)镾ymbian上的3種主要平臺(tái)——Series 60、Series 80和 UIQ。Series 60是智能手機(jī)中應(yīng)用最廣泛的系統(tǒng)版本,擁有最多第三方軟件或游戲的界面。Series 80針對(duì)屏幕分辨率為640×200像素、采用標(biāo)準(zhǔn)鍵盤輸入的高端智能手機(jī)。UIQ針對(duì)采用筆式輸入(觸摸屏)的智能手機(jī)。本系統(tǒng)是在基于Symbian Series 60 3rd FP2(第3版Features Pack 2)平臺(tái)的手機(jī)上實(shí)現(xiàn)的。
在手機(jī)移動(dòng)平臺(tái)上進(jìn)行DM碼解碼處理,圖像采集獲取是重要的第一步。在Symbian Serial 60平臺(tái)上,使用CCamera類對(duì)攝像頭的操作進(jìn)行了封裝,提供了與攝像頭操作有關(guān)的API,并提供了一個(gè)MCameraObserver的類來通知系統(tǒng)攝像頭操作的各種關(guān)鍵事件的完成,必須實(shí)現(xiàn)這個(gè)類的所有純虛方法,以供系統(tǒng)在一個(gè)事件完成的時(shí)候進(jìn)行回調(diào)。McameraObserver類與CCamera類是觀察者設(shè)計(jì)模式(observer designed Pattern)在Symbian中的具體體現(xiàn)。具體啟動(dòng)攝像頭取景器步驟如下:
首先,創(chuàng)建一個(gè)CCamera類的實(shí)例:
這樣以后就可以通過iCamera來實(shí)現(xiàn)對(duì)攝像頭的操作了。然后,取得攝像頭的使用權(quán),這可以通過函數(shù)iCamera->Reserve()來實(shí)現(xiàn)。這是個(gè)異步函數(shù),在取得攝像頭使用權(quán)成功后,系統(tǒng)會(huì)自動(dòng)調(diào)用 MCameraObserver::ReserveComplete()方法。在這個(gè)回調(diào)函數(shù)中,就可以進(jìn)行下一步操作,對(duì)攝像頭進(jìn)行上電啟動(dòng),通過函數(shù)iCamera->PowerOn()來實(shí)現(xiàn),同樣這也是一個(gè)異步函數(shù)。在對(duì)攝像頭上電完成后,系統(tǒng)接著就會(huì)自動(dòng)調(diào)用MCameraObserver::PowerOnComplete()這個(gè)回調(diào)函數(shù),這時(shí)在這個(gè)函數(shù)中就可以啟動(dòng)取景器了,具體函數(shù)為iCamera->StartViewFinderBitmapL()。當(dāng)取景器得到一幀圖像的時(shí)候,系統(tǒng)就會(huì)自動(dòng)的周期性的調(diào)用MCameraObserver::ViewFinderFrameReady(CFbsBitmap aFrame),而放在aFrame這個(gè)參數(shù)中的圖像就是得到的要進(jìn)行處理的圖像,在這個(gè)函數(shù)中完成圖像的解碼。這樣就完成了圖像的采集工作。
一般的DM碼是印刷在商品的包裝上的,這就決定了DM碼的面積不能太大。另外手機(jī)在取景的過程中,操作者可能會(huì)有抖動(dòng)的現(xiàn)象,這兩點(diǎn)原因就給DM碼的圖像采集造成了麻煩,可能導(dǎo)致攝像頭得到的圖像很不清楚,不利于后期的解碼。對(duì)于這一問題,如果攝像頭支持自動(dòng)對(duì)焦(auto focus),那就可以用自動(dòng)對(duì)焦來使攝像頭得到的圖像自動(dòng)變得清晰。
自動(dòng)對(duì)焦是作為Symbian開發(fā)平臺(tái)SDK的擴(kuò)展庫(extension library)中的一個(gè)功能,可由開發(fā)者自行將相應(yīng)的頭文件和庫文件添加到SDK中。具體使用如下:
首先包含頭文件#include<CCamAutoFocus.h>和在Symbian工程的MMP文件中鏈接庫文件LIBRARY Cam-AutoFocus.lib。然后構(gòu)造一個(gè)CCamAutoFocus類的實(shí)例,iAutoFocus=CCamAutoFocus::NewL(iCamera),這樣就可以用iAutoFocus來進(jìn)行自動(dòng)對(duì)焦的相應(yīng)操作。
對(duì)自動(dòng)對(duì)焦進(jìn)行操作需通過以下步驟:
①初始化:iAutoFocus->InitL(*this)。
②開始自動(dòng)對(duì)焦:iAutoFocus->AttemptOptimisedFocusL()。
③取消自動(dòng)對(duì)焦:iAutoFocus->Cancel()。
④關(guān)閉:iAutoFocus->Close()。
對(duì)于初始化和開始自動(dòng)對(duì)焦這兩個(gè)步驟,都有相應(yīng)的回調(diào)函數(shù),CCamEngine ::InitComplete()和 CCamEngine::OptimisedFocusComplete(),以便在完成相應(yīng)動(dòng)作的時(shí)候,開發(fā)者作一些相關(guān)操作。
通過自動(dòng)對(duì)焦,當(dāng)用戶將手機(jī)攝像頭在一定距離內(nèi)對(duì)準(zhǔn)DM碼時(shí),可以看到攝像頭的取景器自動(dòng)變得清晰了,而這對(duì)于解碼來說非常重要。
在本項(xiàng)目中,為了方便用戶,還采用了定時(shí)器的功能,即通過設(shè)定時(shí)間間隔,每隔一段時(shí)間就自動(dòng)對(duì)焦一次,這樣更能保證采集圖像的清晰程度。
Symbian平臺(tái)是專門為嵌入式移動(dòng)設(shè)備而設(shè)計(jì)的操作系統(tǒng),而手機(jī)這一移動(dòng)嵌入式設(shè)備的內(nèi)存資源非常有限,而且通常要連續(xù)運(yùn)行很長時(shí)間卻很少重啟。這兩個(gè)特點(diǎn)就使得內(nèi)存泄漏在Symbian系統(tǒng)上變成了非常重要的問題。對(duì)于這個(gè)問題,Symbian系統(tǒng)采用清除棧和兩階段構(gòu)造來解決[2]。
清除棧(在e32base.h中定義CleanupStack)是一個(gè)特殊棧,它對(duì)于Symbian OS資源管理至關(guān)重要。它在本質(zhì)上是一種用于保護(hù)在異常退出發(fā)生時(shí)清除所有資源,從而不會(huì)產(chǎn)生任何內(nèi)存泄漏的方式。
其基本思想是,在調(diào)用可能異常退出的函數(shù)前,使用PushL()將可能泄露的內(nèi)存指針推入清除棧。如果真的發(fā)生異常,就自動(dòng)刪除推入棧上的指針?biāo)赶虻膬?nèi)存空間;如果沒有發(fā)生異常,就使用Pop()方法從棧上移除指針。這樣就可以避免因?yàn)榘l(fā)生異常而導(dǎo)致的內(nèi)存泄露。
兩階段構(gòu)造就是建立在清除?;A(chǔ)上的一種安全的構(gòu)造對(duì)象的方法。
一般PC平臺(tái)的程序通過new方法來進(jìn)行構(gòu)造的對(duì)象,會(huì)自動(dòng)調(diào)用相應(yīng)的構(gòu)造函數(shù),但如果在構(gòu)造函數(shù)中發(fā)生了異常退出,那么這個(gè)對(duì)象前期所申請(qǐng)的內(nèi)存就會(huì)產(chǎn)生泄露。兩階段構(gòu)造就是用于解決這一問題的。
本項(xiàng)目基于Symbian Serial 60 3rd FP1平臺(tái),而目前已經(jīng)有了Symbian Serial 60 3rd FP2和Symbian Serial 60 5th(第5版)。這2個(gè)版本和本項(xiàng)目的平臺(tái)版本的一個(gè)重要區(qū)別,就是對(duì)攝像頭的操作。為了與這兩個(gè)版本保持兼容,需要將對(duì)攝像頭操作的CCamera類換成CCameraEngine類。這個(gè)類同樣也是一個(gè)SDK擴(kuò)展功能,使用時(shí)要包含頭文件#include"CamEngine.h"和鏈接庫LIBRARY camerawrapper.lib。
本系統(tǒng)在NOKIA N82和NOKIA N95上進(jìn)行了測(cè)試,可以正確、快速地進(jìn)行解碼;在NOKIA 5800(Symbian S60第五版)上進(jìn)行了兼容性測(cè)試,也得到了很好的效果。
本文通過介紹DataMatrix二維條碼的基本原理和識(shí)別解碼的基本步驟,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于Symbian平臺(tái)的DataMatrix的識(shí)別系統(tǒng)。詳細(xì)介紹了Symbian平臺(tái)攝像頭的應(yīng)用和自動(dòng)對(duì)焦的特點(diǎn),并對(duì)不同的Symbian平臺(tái)版本之間的代碼兼容作了說明。
本系統(tǒng)可以準(zhǔn)確、快速地識(shí)別二維條碼。還可以加入驗(yàn)證功能,即通過網(wǎng)絡(luò)連接或發(fā)送短信的方式,將識(shí)別所得的二維條碼所包含的真?zhèn)涡畔l(fā)送的服務(wù)器,在服務(wù)器端進(jìn)行防偽驗(yàn)證工作,并將驗(yàn)證結(jié)果返回給用戶。此功能目前已經(jīng)實(shí)現(xiàn),這也是本系統(tǒng)的一項(xiàng)擴(kuò)展應(yīng)用??梢灶A(yù)見,通過使用手機(jī)識(shí)別二維條碼來獲取信息的應(yīng)用前景將會(huì)非常廣泛。
[1]高木干雄,下田陽久.圖像處理技術(shù)手冊(cè)[M].北京:科學(xué)出版社,2007.
[2]Leigh Edwards,Richard Barker.Serial 60應(yīng)用程序開發(fā)[M].周良忠,譯.北京:人民郵電出版社,2005.
[3]劉寧鐘,楊靜宇.基于傅里葉變換的二維條碼識(shí)別[J].中國圖像圖形學(xué)報(bào),2003,8(8):877-882.
[4]劉寧鐘,楊靜宇.基于波形分析的二維條碼識(shí)別[J].計(jì)算機(jī)研究與發(fā)展,2004,41(3):463-469.
[5]章毓晉.圖象處理和分析[M].北京:清華大學(xué)出版社,1999.
[6]王新梅,肖國鎮(zhèn).糾錯(cuò)碼——原理與方法[M].西安:西安電子科技出版社,2001.
[7]史冊(cè),徐勝榮,荊仁杰,等.實(shí)時(shí)圖像處理中一種快速的直線檢測(cè)算法[J].浙江大學(xué)學(xué)報(bào).1999(9).