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