物聯(lián)傳媒 旗下網(wǎng)站
登錄 注冊

基于Android嵌入式平臺的QR碼識別系統(tǒng)

作者:RFID世界網(wǎng)收編
來源:RFID世界網(wǎng)
日期:2012-03-05 10:33:34
摘要:介紹了QR 碼的基本結(jié)構(gòu),分析了在基于Android 嵌入式平臺上QR 碼圖像數(shù)據(jù)的二值化、定位、旋正等圖像的預(yù)處理,進而實現(xiàn)對QR 碼進行解碼。經(jīng)測試表明,系統(tǒng)對傾斜、模糊的QR 碼都可以快速地識別。

  QR 碼又稱快速響應(yīng)矩陣碼,是日本Denso 公司于1994 年開發(fā)的一種二維碼,它具有信息密度高、可全方位識別、可靠性高等優(yōu)點,并可以很好地表示漢字。

  我國于2000 年發(fā)布了QR 碼的國家標(biāo)準(zhǔn),隨著QR 碼在各領(lǐng)域的推廣和智能手機的快速發(fā)展,如何在智能手機中較好地識別QR 碼是一項值得研究的課題,文中將主要討論在Android 平臺下識別QR 碼。

  1 QR 碼符號結(jié)構(gòu)

  QR 碼屬于矩陣式二維條碼,每個QR 碼符號都是由正方形模塊組成的一個正方形陣列結(jié)構(gòu),它由功能圖形和編碼區(qū)域組成,功能圖形不用于數(shù)據(jù)編碼,它包括尋像圖形、分隔符、定位圖形和校正圖形。編碼區(qū)域包括數(shù)據(jù)碼字、糾錯碼字、版本信息和格式信息。QR碼共有40 種規(guī)格,分為版本1 ~ 版本40,規(guī)格為: 21模塊× 21 模塊~ 177 模塊× 177 模塊。QR 碼具有高信息密度、高識別速度以及高可靠性等特點。QR 碼的符號結(jié)構(gòu)如圖1 所示。 


  2 系統(tǒng)的流程

  系統(tǒng)在基于Android 平臺上使用Java 和C ++ 語言一同實現(xiàn)。系統(tǒng)主要分為圖像采集模塊、圖像預(yù)處理模塊和條碼識別模塊。圖像采集模塊主要利用攝像頭來完成條碼圖像的采集,并將采集的圖像在屏幕上顯示;圖像預(yù)處理模塊主要是對采集的條碼圖像進行灰度、二值化、定位、矯正等處理,條碼識別模塊主要根據(jù)QR 碼標(biāo)準(zhǔn)來對條碼數(shù)據(jù)進行提取。系統(tǒng)流程圖如圖2 所示。 

  3 QR 碼的識別算法 

  3. 1 圖像二值化 

  圖像的二值化是把灰度圖像轉(zhuǎn)成黑白圖像,這樣更有利于圖像處理的判別,灰度閾值的變換函數(shù)如下 


  如何確定閾值T 是二值化算法的關(guān)鍵,它決定了圖像二值化的效果。文中采用OTSU 算法[3,5],假設(shè)圖像分割的閾值為t( 0≤t < 256) ,≤t 的為前景像素,> t 的為背景像素,設(shè)前景點數(shù)占圖像比例為w0,平均灰度為u0; 背景點數(shù)占圖像比例為w1,平均灰度為u1。則圖像的總平均灰度為 


  取得最大值時,t 就為圖像的最佳閾值。對式( 2) 進行化簡,得 


  這樣則大大減少了計算量。
 
  3. 2 QR 碼的定位 

  為檢測QR 碼的位置,利用QR 碼的位置探測圖形的特征。由圖3 可見,當(dāng)直線穿越探測圖形中心時,從左至右的深淺比例依次是1∶ 1∶ 3∶ 1∶ 1,而且這個比例不隨圖像的大小和旋轉(zhuǎn)而改變,所以可以利用此特性來檢測QR 碼的位置。


 

  根據(jù)探測圖形的比例特性,對圖像由水平和豎直方向進行掃描,當(dāng)遇到深淺比例按1∶ 1∶ 3∶ 1∶ 1 出現(xiàn)時,記錄其行或列的位置,并繼續(xù)搜索相鄰行和列,直至所有的行和列被掃描到,記錄最先出現(xiàn)的行與列的位置。這樣一共可以得到4 條直線,圍成一個正方形,正方形對角線的交點即為探測圖形的中心,同理,可以確定其他兩個探測圖形的中心。連接探測圖形的3 個中心點,可以計算出3 條邊的大小,根據(jù)三角形大邊對大角的原則,可以選擇一條直角邊,計算出它的傾斜角,然后將圖像旋正。 

  3. 3 圖像的旋轉(zhuǎn) 

  這里采用雙線性插值[4]對圖像進行旋轉(zhuǎn),而不是利用最鄰插值法,因為它會使圖像產(chǎn)生鋸齒形的邊界,干擾條碼的識別。雙線性插值的數(shù)學(xué)模型如圖4 所示。 


  f( x,y ) 為兩個變量x,y 的平滑函數(shù),假設(shè)它所在單位正方形的4 個頂點的值為f( 0,0) 、f( 0,1) 、f( 1,0) 、f( 1,1) ,則可以利用雙線性插值求出正方形內(nèi)任意點( x,y) 的值f( x,y) ,首先對兩個頂點進行插值得


  圖5( a) 為傾斜的條碼,圖5( b) 為采用雙線性插值旋轉(zhuǎn)的結(jié)果,實驗表明,雙線性插值處理后得到的圖像具有良好的效果,有利于條碼識別。 


{$page$}

  3. 4 圖像的矯正
 
  由于在拍攝時,攝像頭的角度不會完全垂直于二維條碼平面,因此拍攝到的條碼或多或少會有透視效果,在手持手機拍攝時,這個問題很常見,也是圖像處理中的難點。這里使用反透視算法[7],能夠?qū)D像進行反透視矯正。設(shè)三維失真空間中的一點坐標(biāo)[x',y ',z'],其其次坐標(biāo)可以設(shè)為[x',y',z',1]T ; 三維基準(zhǔn)空間中對應(yīng)點坐標(biāo)[x,y,z],其其次坐標(biāo)設(shè)為[x',y',z',k]T,因此有公式為 


  在上述定位算法中,得到了條碼的3 個探測圖形中心點的坐標(biāo),因此可以得出條碼4 個頂點的坐標(biāo),根據(jù)如下基準(zhǔn)點與失真點的映射關(guān)


  根據(jù)式( 7) 和式( 8) ,可以得出 


  一般地P = 1,k = 1,失真圖像和校正后的圖像共面,那么z = z' = c,c 是常數(shù),令c = 0,可以將( 9) 簡化為 


  可以根據(jù)條碼的4 組頂點,求出8 個待定系數(shù)A,B,D,E,F(xiàn),H,M,N,然后對條碼的每個點進行矯正。
 
  4 QR 碼識別系統(tǒng)在Android 平臺上實現(xiàn) 

  4. 1 Android 簡介 

  Android 是基于Linux 平臺的開源手機操作系統(tǒng),它采用軟件堆層的架構(gòu),主要分為3 個部分: 操作系統(tǒng)、中介軟件和應(yīng)用程序。底層以Linux 內(nèi)核工作為基礎(chǔ),用C 語言開發(fā),只提供基本功能; 中間層包裹函數(shù)庫Library 和虛擬機Virtual Machine,由C ++ 開發(fā);最上層是各種應(yīng)用軟件,包括通話程序,短信程序等,主要以Java 作為編程語言。
  為能夠快速地處理大量的數(shù)據(jù),Android 也提供了以C /C ++ 作為開發(fā)語言的NDK( Native Developer Kit)平臺,它編譯生成的. SO 動態(tài)鏈接庫可以供AndroidSDK( Software Development Kit) 平臺下的應(yīng)用程序調(diào)用。在本系統(tǒng)的實現(xiàn)中,因為圖像的預(yù)處理和解碼部分要進行大量數(shù)據(jù)運算,所以把這兩部分的程序放在NDK 下完成,攝像頭啟動與圖像采集在SDK 下實現(xiàn)。由于Android 的虛擬機Dalvik 不能執(zhí)行. class 文件,所以要把. class 文件的字節(jié)碼轉(zhuǎn)換成. dex 文件的字節(jié)碼,識別系統(tǒng)的編譯過程如圖5 所示。 

  4. 2 圖像的采集 

  系統(tǒng)在手機上實現(xiàn),圖像的采集[2 - 6]是重要的一步,在Android 平臺上,是使用Camera 類來完成攝像頭的調(diào)用和圖像采集。使用Camera mCamera = Camera.open ( ) 獲得Camera 的實例,然后使用Camera.Parameters 來設(shè)置獲得圖像的大小,最后通過實現(xiàn)Camera. Preview - Callback 的接口onPreviewFrame( byte []data,Camera camera) 來獲得攝像頭的圖像數(shù)據(jù)。圖像數(shù)據(jù)data 為YUV 格式,其中Y 分量的大小為 mageWidth* ImageHeight 個字節(jié),U 分量的大小為0. 25 × ImageWith* ImageHeight 個字節(jié),V 分量的大小和U 分量一樣,因為條碼是黑白色,Y 分量正好包含的是圖像的灰度信息,將省去對圖像進行灰度化的處理,所以在取圖像數(shù)據(jù)時,只取Y 分量進行處理。 

  4. 3 自動對焦 

  為能夠較快地獲得清晰的圖像,提高識別速度,文中使用了自動對焦技術(shù)。關(guān)鍵代碼如下:
  ( 1) 實現(xiàn)自動對焦的接口
  AutoFocusCallback Camera. AutoFocusCallback mAutoFocusCallback =
  new Camera. AutoFocusCallback( )
  {
  Public void onAutoFocus( boolean success,Camera
  camera)
  {
  mCamera. setOneShotPreviewCallback ( mPreviewCallback)
  ;
  }
  }
  ( 2) 創(chuàng)建一個定時器
  創(chuàng)建定時器的目的是使手機每隔一段間隔就自動對焦一次。定時器內(nèi)的代碼如下: 

  mCamera. autoFoucs( mAutoFocusCallback) ; 

  5 結(jié)束語 

  文中研究了QR 碼的識別技術(shù),討論了在Android平臺上實現(xiàn)系統(tǒng)的技術(shù)問題,并結(jié)合數(shù)字圖像處理技術(shù),在Android 手機平臺上進行了QR 碼的識別技術(shù)的開發(fā)。根據(jù)圖像的大小,本系統(tǒng)在三星i9000( CPU 型號ARM Cortex A8,主頻為1 GHz,內(nèi)存512 MB,操作系統(tǒng)為Android OS v2. 1) 上分別對100 幅圖像進行了測試,結(jié)果如表1 所示。