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