基于Android嵌入式平臺的QR碼識別系統
QR 碼又稱快速響應矩陣碼,是日本Denso 公司于1994 年開發的一種二維碼,它具有信息密度高、可全方位識別、可靠性高等優點,并可以很好地表示漢字。
我國于2000 年發布了QR 碼的國家標準,隨著QR 碼在各領域的推廣和智能手機的快速發展,如何在智能手機中較好地識別QR 碼是一項值得研究的課題,文中將主要討論在Android 平臺下識別QR 碼。
1 QR 碼符號結構
QR 碼屬于矩陣式二維條碼,每個QR 碼符號都是由正方形模塊組成的一個正方形陣列結構,它由功能圖形和編碼區域組成,功能圖形不用于數據編碼,它包括尋像圖形、分隔符、定位圖形和校正圖形。編碼區域包括數據碼字、糾錯碼字、版本信息和格式信息。QR碼共有40 種規格,分為版本1 ~ 版本40,規格為: 21模塊× 21 模塊~ 177 模塊× 177 模塊。QR 碼具有高信息密度、高識別速度以及高可靠性等特點。QR 碼的符號結構如圖1 所示。
.jpg)
2 系統的流程
系統在基于Android 平臺上使用Java 和C ++ 語言一同實現。系統主要分為圖像采集模塊、圖像預處理模塊和條碼識別模塊。圖像采集模塊主要利用攝像頭來完成條碼圖像的采集,并將采集的圖像在屏幕上顯示;圖像預處理模塊主要是對采集的條碼圖像進行灰度、二值化、定位、矯正等處理,條碼識別模塊主要根據QR 碼標準來對條碼數據進行提取。系統流程圖如圖2 所示。
.jpg)
3 QR 碼的識別算法
3. 1 圖像二值化
圖像的二值化是把灰度圖像轉成黑白圖像,這樣更有利于圖像處理的判別,灰度閾值的變換函數如下
.jpg)
如何確定閾值T 是二值化算法的關鍵,它決定了圖像二值化的效果。文中采用OTSU 算法[3,5],假設圖像分割的閾值為t( 0≤t < 256) ,≤t 的為前景像素,> t 的為背景像素,設前景點數占圖像比例為w0,平均灰度為u0; 背景點數占圖像比例為w1,平均灰度為u1。則圖像的總平均灰度為
.jpg)
取得最大值時,t 就為圖像的最佳閾值。對式( 2) 進行化簡,得
![]()
這樣則大大減少了計算量。
3. 2 QR 碼的定位
為檢測QR 碼的位置,利用QR 碼的位置探測圖形的特征。由圖3 可見,當直線穿越探測圖形中心時,從左至右的深淺比例依次是1∶ 1∶ 3∶ 1∶ 1,而且這個比例不隨圖像的大小和旋轉而改變,所以可以利用此特性來檢測QR 碼的位置。
.jpg)
根據探測圖形的比例特性,對圖像由水平和豎直方向進行掃描,當遇到深淺比例按1∶ 1∶ 3∶ 1∶ 1 出現時,記錄其行或列的位置,并繼續搜索相鄰行和列,直至所有的行和列被掃描到,記錄最先出現的行與列的位置。這樣一共可以得到4 條直線,圍成一個正方形,正方形對角線的交點即為探測圖形的中心,同理,可以確定其他兩個探測圖形的中心。連接探測圖形的3 個中心點,可以計算出3 條邊的大小,根據三角形大邊對大角的原則,可以選擇一條直角邊,計算出它的傾斜角,然后將圖像旋正。
3. 3 圖像的旋轉
這里采用雙線性插值[4]對圖像進行旋轉,而不是利用最鄰插值法,因為它會使圖像產生鋸齒形的邊界,干擾條碼的識別。雙線性插值的數學模型如圖4 所示。
.jpg)
f( x,y ) 為兩個變量x,y 的平滑函數,假設它所在單位正方形的4 個頂點的值為f( 0,0) 、f( 0,1) 、f( 1,0) 、f( 1,1) ,則可以利用雙線性插值求出正方形內任意點( x,y) 的值f( x,y) ,首先對兩個頂點進行插值得
.jpg)
圖5( a) 為傾斜的條碼,圖5( b) 為采用雙線性插值旋轉的結果,實驗表明,雙線性插值處理后得到的圖像具有良好的效果,有利于條碼識別。
.jpg)
{$page$}
3. 4 圖像的矯正
由于在拍攝時,攝像頭的角度不會完全垂直于二維條碼平面,因此拍攝到的條碼或多或少會有透視效果,在手持手機拍攝時,這個問題很常見,也是圖像處理中的難點。這里使用反透視算法[7],能夠對圖像進行反透視矯正。設三維失真空間中的一點坐標[x',y ',z'],其其次坐標可以設為[x',y',z',1]T ; 三維基準空間中對應點坐標[x,y,z],其其次坐標設為[x',y',z',k]T,因此有公式為
.jpg)
在上述定位算法中,得到了條碼的3 個探測圖形中心點的坐標,因此可以得出條碼4 個頂點的坐標,根據如下基準點與失真點的映射關
.jpg)
根據式( 7) 和式( 8) ,可以得出
.jpg)
一般地P = 1,k = 1,失真圖像和校正后的圖像共面,那么z = z' = c,c 是常數,令c = 0,可以將( 9) 簡化為
.jpg)
可以根據條碼的4 組頂點,求出8 個待定系數A,B,D,E,F,H,M,N,然后對條碼的每個點進行矯正。
4 QR 碼識別系統在Android 平臺上實現
4. 1 Android 簡介
Android 是基于Linux 平臺的開源手機操作系統,它采用軟件堆層的架構,主要分為3 個部分: 操作系統、中介軟件和應用程序。底層以Linux 內核工作為基礎,用C 語言開發,只提供基本功能; 中間層包裹函數庫Library 和虛擬機Virtual Machine,由C ++ 開發;最上層是各種應用軟件,包括通話程序,短信程序等,主要以Java 作為編程語言。
為能夠快速地處理大量的數據,Android 也提供了以C /C ++ 作為開發語言的NDK( Native Developer Kit)平臺,它編譯生成的. SO 動態鏈接庫可以供AndroidSDK( Software Development Kit) 平臺下的應用程序調用。在本系統的實現中,因為圖像的預處理和解碼部分要進行大量數據運算,所以把這兩部分的程序放在NDK 下完成,攝像頭啟動與圖像采集在SDK 下實現。由于Android 的虛擬機Dalvik 不能執行. class 文件,所以要把. class 文件的字節碼轉換成. dex 文件的字節碼,識別系統的編譯過程如圖5 所示。
.jpg)
4. 2 圖像的采集
系統在手機上實現,圖像的采集[2 - 6]是重要的一步,在Android 平臺上,是使用Camera 類來完成攝像頭的調用和圖像采集。使用Camera mCamera = Camera.open ( ) 獲得Camera 的實例,然后使用Camera.Parameters 來設置獲得圖像的大小,最后通過實現Camera. Preview - Callback 的接口onPreviewFrame( byte []data,Camera camera) 來獲得攝像頭的圖像數據。圖像數據data 為YUV 格式,其中Y 分量的大小為 mageWidth* ImageHeight 個字節,U 分量的大小為0. 25 × ImageWith* ImageHeight 個字節,V 分量的大小和U 分量一樣,因為條碼是黑白色,Y 分量正好包含的是圖像的灰度信息,將省去對圖像進行灰度化的處理,所以在取圖像數據時,只取Y 分量進行處理。
4. 3 自動對焦
為能夠較快地獲得清晰的圖像,提高識別速度,文中使用了自動對焦技術。關鍵代碼如下:
( 1) 實現自動對焦的接口
AutoFocusCallback Camera. AutoFocusCallback mAutoFocusCallback =
new Camera. AutoFocusCallback( )
{
Public void onAutoFocus( boolean success,Camera
camera)
{
mCamera. setOneShotPreviewCallback ( mPreviewCallback)
;
}
}
( 2) 創建一個定時器
創建定時器的目的是使手機每隔一段間隔就自動對焦一次。定時器內的代碼如下:
mCamera. autoFoucs( mAutoFocusCallback) ;
5 結束語
文中研究了QR 碼的識別技術,討論了在Android平臺上實現系統的技術問題,并結合數字圖像處理技術,在Android 手機平臺上進行了QR 碼的識別技術的開發。根據圖像的大小,本系統在三星i9000( CPU 型號ARM Cortex A8,主頻為1 GHz,內存512 MB,操作系統為Android OS v2. 1) 上分別對100 幅圖像進行了測試,結果如表1 所示。
.jpg)