引言
目前,條碼技術(shù),,尤其是二維條碼技術(shù)應(yīng)用廣泛。2006 年, 中國移動正式推出了手機二維條碼業(yè)務(wù),,主要應(yīng)用于移動增值服務(wù),。2009年,,鐵道部門正式用QR碼取代一維條碼應(yīng)用于火車票票據(jù)的檢測??梢灶A見隨著3G時代的到來、現(xiàn)代物流業(yè)的發(fā)展以及物聯(lián)網(wǎng)的推廣,,條碼識別和應(yīng)用必將得到全面的飛速發(fā)展,。
1 QR碼簡介
QR碼是由日本Denso公司于1994年9月研制的一種矩陣二維條碼符號,。它具有信息容量大,、可靠性高,、可表示文字圖像等多種信息、保密防偽性強等優(yōu)點,,還具有高速全方位識讀,、能有效表示中國漢字與日本漢字等主要特點。如圖1所示,,每個QR碼符號由編碼區(qū)域和功能圖形組成,其*能圖形包括位置探測圖形,、分隔符和校正圖形,。
圖1 二維條碼QR碼
2 系統(tǒng)總體設(shè)計
2.1 系統(tǒng)硬件結(jié)構(gòu)
圖2 WinCE硬件架構(gòu)
本系統(tǒng)采用基于WinCE嵌入式的智能手機為硬件平臺,,其硬件結(jié)構(gòu)如圖2所示,。主處理器DSP上外接攝像頭控制器、LCD控制器,、SRAM控制器,、通用GPIO口,、UART口等。攝像頭完成圖像數(shù)據(jù)的采集后,,系統(tǒng)會在SRAM中創(chuàng)建一片視頻幀緩沖區(qū),,通過Allocator組件來進行動態(tài)管理,,將捕捉到的圖像一路傳給主處理器DSP進行圖像實時處理,另一路傳給LCD控制器進行圖像的預覽,。主處理器負責主界面的顯示/條碼的實時識別和解碼,以及輸入信息的處理,。
2.2 系統(tǒng)軟件流程
系統(tǒng)軟件在基于WinCE 6.0的Windows Mobile 5.0 Pocket PC和Windows Mobile 5.0 SmartphONe平臺上使用C++語言實現(xiàn),。軟件主要分為圖像采集模塊,、圖像預處理模塊,、識別解碼模塊和應(yīng)用模塊4個模塊,。圖像采集模塊主要完成條碼圖像的采集,,一方面通過攝像頭進行數(shù)據(jù)采集實時解碼,另一方面把采集的圖像數(shù)據(jù)送屏幕顯示,。圖像預處理模塊主要是對采集的QR碼圖像進行預處理,包括灰度化,、中值濾波,、二值化等,為識別解碼做好前期準備工作,。識別解碼模塊主要功能包括QR條碼的檢測,、定位,、分割、識別以及條碼解碼,。應(yīng)用模塊主要包括發(fā)送郵件、撥打電話,、訪問網(wǎng)址、存儲條碼信息和短信應(yīng)用等,。軟件流程如圖3所示,。
圖3 軟件設(shè)計流程
3 QR碼識別解碼的核心算法
考慮到QR碼圖像的特點,、嵌入式平臺的處理速度、條碼本身的污染扭曲,,以及在圖像采集過程中光照不均、抖動等因素,,QR碼識別解碼的基本過程是:首先對采集的彩色圖像進行灰度化、濾波,、二值化,,接著在二值化圖像中掃描QR碼圖像,,將其從圖像中分割出來,進行解碼,。
3.1圖像灰度化、濾波與二值化選取彩色圖像的G值(綠色分量)為灰度圖像I(x,,y)的值,并使用中值濾波去噪聲,。二值化采用OSTu算法計算閾值,。Ostu算法效果好,,但計算量比較大,可將圖像分成7×7個小分塊,,對每一個小分塊使用Ostu算法計算閾值從而來降低時耗。
3.2 條碼檢測,、定位及矯正
在獲取QR碼圖像數(shù)據(jù)時,可能會因為拍攝角度等原因造成圖像幾何失真,,例如獲取的QR碼圖像為任意四邊形,,則須對失真圖像進行反透視變換[4],。變換算法如圖4所示。
圖4 反透視變換
(u,v)是失真圖像的坐標,,(x,y)是基準圖像的坐標,,A′B′C′D′為任意四邊形,,ABCD為矯正后的正方形,則對于u,、v坐標系A(chǔ)′B′C′D′任意四邊形中的任意一點(u,v),,對應(yīng)在x、y坐標系上的點(x,y),可通過轉(zhuǎn)換公式
計算獲得,。通過已知四組點得到8個待定系數(shù)A,、B、D,、E,、F,、H,、M、N,,然后進行透視矯正,。
根據(jù)QR碼標準定義,QR碼符號含有3個相同的位置探測圖形,。每個位置探測圖形由3個重疊的同心正方形組成,,其模塊寬度比為1∶1∶3∶1∶1。其他地方遇到類似圖形的可能性極小,,因此可以在得到的二值化圖像中迅速地識別可能的QR碼符號,,完成對條碼的檢測與定位[5]。但是,,在對條碼進行矯正時,,需要知道4個頂點,。通過定位3個位置探測圖形可獲得其中3個頂點,,利用下面基于QR碼紋理特征的算法來尋找第4個頂點。
首先根據(jù)已經(jīng)得到3個頂點的位置,,可以確定QR碼符號的兩條邊界,,及其邊界直線斜率θ1、θ2,,然后舍去其交叉的頂點,。對于剩下的兩個頂點,分別利用它作為直線上的一點,,以一定范圍的角度(-θ,θ)進行搜索來尋找條碼邊界,,依據(jù)是包含條碼跳數(shù)(黑塊與白塊交替一次稱為一跳)最多的直線即為條碼的邊界。通過這種方法可以找出需要的另外兩條邊界,,其交點即為第4個頂點,。知道4個頂點以后,通過反透視變換將其矯正到正確位置,,如圖5所示,。旋轉(zhuǎn)后會產(chǎn)生鋸齒邊界,這里利用雙線性插值對圖像進行平滑處理[6],。對相鄰的4 個像素進行插值,,其單位正方形上任意一點f (x, y) 有:
在編程實現(xiàn)時,反透視變換和雙線性插值同時進行,。分割出QR碼后進行解碼,,其解碼過程不是本文重點,,不再詳細闡述。
圖5 反透視變換
4 圖像采集子系統(tǒng)
4.1 DirectShow體系結(jié)構(gòu)
DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎(chǔ)上推出的新一代基于COM的流媒體處理的開發(fā)包,。其系統(tǒng)架構(gòu)圖如圖6所示。DirectShow通過過濾器圖表管理器(Filter Graph Manager)來與上層應(yīng)用程序和下層的驅(qū)動進行聯(lián)系,。應(yīng)用程序可以通過Filter Graph Manager提供的一組組件對象模型接口來訪問過濾器或者控制多媒體數(shù)據(jù)流,,例如控制數(shù)據(jù)幀率、圖像大小,、圖像質(zhì)量等等,。在本系統(tǒng)中采用COM組件來訪問DirectShow中的過濾器,從而獲得QR碼圖像數(shù)據(jù),。
圖6 DirectShow系統(tǒng)架構(gòu)圖
4.2 QR碼圖像采集
4.2.1 編寫處理QR碼圖像數(shù)據(jù)的Filter
通過DirectShow提供的視頻采集Filter來驅(qū)動攝像頭以獲得視頻幀,。在采集到圖像數(shù)據(jù)后編寫處理QR碼圖像數(shù)據(jù)的Filter,它調(diào)用預處理與識別解碼模塊進行數(shù)據(jù)處理,。編寫一個Filter主要包括兩個方面:選擇一個合適的父類和應(yīng)用結(jié)構(gòu)設(shè)計。這里選擇CTransformFilter作為Filter的父類,。對于應(yīng)用結(jié)構(gòu)的設(shè)計,在重寫CTransformFilter∶∶Transform()函數(shù)時產(chǎn)生一個線程來調(diào)用預處理與識別解碼模塊,,這樣使得編寫的Filter結(jié)構(gòu)清晰,、可擴展性良好。
4.2.2 構(gòu)建Filter Graph
首先創(chuàng)建一個Filter Graph,,再根據(jù)Filter各自的GUID號來創(chuàng)建不同的Filter對象,,并調(diào)用Filter Graph的接口AddFilter把這些Filter一一加入Filter Graph中。然后利用Capture Graph Builder對象提供的IcaptureGraphBuilder2接口將所有Filter“串聯(lián)”起來,,從而構(gòu)建一個完整的Filter Graph數(shù)據(jù)流,。下面為構(gòu)建Filter Graph的主要步驟及關(guān)鍵源代碼。
① 創(chuàng)建并初始化Filter Graph Manager組件對象,。CoCreateInstance(CLSID_FilterGraph,0,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (VOID**)&m_pGraphBuilder);CoCreateInstance (CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (VOID**)&m_pCaptureGraphBuilder);m_pCaptureGraphBuilder﹥SetFiltergraph(m_pGraphBuilder);
② 創(chuàng)建視頻采集Filter對象,,并添加進Filter Graph中,其他Filter類似,。
m_pSourceFilter.CoCreateInstance (CLSID_VideoCapture);
m_pGraphBuilder﹥AddFilter (m_pSourceFilter, L"Video capture source");
③ 將編寫好的處理QR碼圖像數(shù)據(jù)的Filter也加入其中。
pTransFilter.CoCreateInstance(CLSID_CamTransform);
m_pGraphBuilder﹥AddFilter(pTransFilter,L"Transform");
④ 將添加的各個Filter“串聯(lián)”起來,,形成一個完整的數(shù)據(jù)流,。
m_pCaptureGraphBuilder﹥RenderStream (&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pSourceFilter, m_pTransFilter,NULL));
4.2.3 自動對焦
在使用攝像頭進行取像的過程中,有可能發(fā)生抖動現(xiàn)象,,圖像會變得模糊,。使攝像頭自動對焦,從而獲得更為清晰的圖像數(shù)據(jù),,對快速準確識別QR碼至關(guān)重要,。WinCE 6.0和Windows Mobile 5.0及更高版本均支持自動對焦。在本系統(tǒng)中,,主要步驟及關(guān)鍵源代碼如下:
① 獲取攝像頭控制接口,。
m_pCaptureGraphBuilder﹥FindInterface (&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pSourceFilter, IID_IAMCameraControl, (VOID **) &pCamConfig);
② 設(shè)置自動對焦,。
pCamConfig﹥Set (CameraControl_Zoom, iDefault, CameraControl_Flags_Auto);
以上步驟描述了WinCE嵌入式設(shè)備的攝像頭采集圖像數(shù)據(jù)的過程,,構(gòu)建好Filter Graph后即可通過攝像頭采集QR碼圖像。
結(jié)語
本文分析研究了QR碼的檢測和識別技術(shù),,討論了在WinCE移動平臺上實現(xiàn)QR碼識別系統(tǒng)的技術(shù)問題(主要是如何實現(xiàn)QR圖像實時采集),,并結(jié)合數(shù)字圖像處理技術(shù)在WinCE手機移動平臺上進行了QR碼識別系統(tǒng)的開發(fā)。本系統(tǒng)在多普達585 和HTC P600上進行了測試,。測試表明,,該系統(tǒng)可以快速準確地檢測出QR碼圖像,在多普達585(CPU為OMAP850,,主頻195 MHz,,64 MB RAM,圖像分辨率為320×240)上解碼平均耗時約450 ms,,只有對極少數(shù)本身污染特別嚴重的條碼不能識別,。目前,本系統(tǒng)軟件已經(jīng)成功推向市場,。