二維條碼" title="二維條碼">二維條碼PDF417中PDF為Portable Data File的縮寫,每一個PDF碼的儲存量可高達(dá)1 108字節(jié),,若將數(shù)字壓縮則可存放2 729字節(jié),。作為一種新的信息存儲和傳遞技術(shù),PDF417具有成本低,、信息可隨載體移動,、不依賴于數(shù)據(jù)庫和計(jì)算機(jī)網(wǎng)絡(luò),、保密防偽性能強(qiáng)等優(yōu)點(diǎn),廣泛應(yīng)用在國防,、公共安全,、交通運(yùn)輸、醫(yī)療保健,、工業(yè),、商業(yè),、金融,、海關(guān)及政府管理等領(lǐng)域,PDF417碼的例子如圖1所示,。
1 系統(tǒng)總體設(shè)計(jì)
本系統(tǒng)在FPGA上使用SOPC" title="SOPC">SOPC技術(shù)來實(shí)現(xiàn)無線手持二維條碼識讀器,,與傳統(tǒng)一維條碼識讀器最大的區(qū)別在于完全脫離后臺數(shù)據(jù)庫,以及在高達(dá)50%破損率的情況下能夠進(jìn)行高效率識別,。
SOPC技術(shù)是一種基于FPGA解決方案的SOC,,由美國Altera公司于2000年提出?;赟OPC平臺的開發(fā)結(jié)合了FPGA靈活可編程與片上,。NioslI軟核處理器的用戶可配置等特點(diǎn)。在實(shí)現(xiàn)某功能時,,通過在NiosII" title="NiosII">NiosII處理器下編寫C程序運(yùn)行,,也可以使用硬件模塊來加速。本系統(tǒng)綜合兩種實(shí)現(xiàn)思路,,采用高性價(jià)比的Cyclone II EP2C35" title="EP2C35">EP2C35系列FPGA實(shí)現(xiàn),,系統(tǒng)總體結(jié)構(gòu)如圖2所示。
整個系統(tǒng)由低到高分為三個層次:條碼識別的硬件平臺,、μC/OS—II操作系統(tǒng),、條碼譯碼核心算法。最底層硬件平臺采用Altera公司的Cylone II" title="Cylone II">Cylone II EP2C35與ADI公司的視頻解碼芯片ADV7181B,,具有8 MB的Flash存儲器,,1.MB的SRAM等外設(shè);中間層μC/OS—II操作系統(tǒng)提供任務(wù)調(diào)度和設(shè)備驅(qū)動,,以及提供各種中斷來實(shí)現(xiàn)對外界請求的響應(yīng),,如模式切換、LCM.顯示,、射頻傳送等,,有效地提高了系統(tǒng)運(yùn)行速率;最頂層條碼譯碼核心算法包括了對條碼圖像的預(yù)處理和對譯碼數(shù)據(jù)的RS糾錯,,采用C語言在NiosII的集成開發(fā)環(huán)境中(IDE)實(shí)現(xiàn),。
1.1 系統(tǒng)硬件結(jié)構(gòu)
系統(tǒng)通過配置視頻采集芯片ADV7181B,通過圖像采集子系統(tǒng)將CCD采集到的條碼數(shù)據(jù)存儲在SRAM中后,產(chǎn)生硬件中斷,,處理器響應(yīng)中斷,,Nios對SRAM中的數(shù)據(jù)進(jìn)行圖像預(yù)處理、譯碼及糾錯,,通過譯碼算法硬件加速模塊對耗時較多部分算法進(jìn)行優(yōu)化,,在實(shí)現(xiàn)條碼數(shù)據(jù)譯碼及糾錯后,產(chǎn)生射頻傳送和LCM顯示中斷,,進(jìn)入中斷程序?qū)⒆g碼數(shù)據(jù)通過射頻傳輸模塊發(fā)送到上位機(jī),,并且在LCM實(shí)時顯示。其硬件平臺結(jié)構(gòu)原理如圖3所示,。
1.2 圖像采集子系統(tǒng)
由于本設(shè)計(jì)采用的是灰度圖,,因此圖像采集子系統(tǒng)的主要功能是:配置采集芯片,從解碼芯片讀出數(shù)據(jù)流,,根據(jù)行場同步信號對數(shù)據(jù)流進(jìn)行分離,,提取出亮度信號,并將采集到的亮度信號通過乒乓緩存存入SRAM中,。
在設(shè)計(jì)中,,采用ADI的解碼芯片ADV7181B進(jìn)行圖像信號的數(shù)模轉(zhuǎn)換,F(xiàn)PGA中的I2C模塊是作為主設(shè)備來對ADV7181B進(jìn)行配置的,,而ADV7181B作為從設(shè)備來接受I2C總線傳來的數(shù)據(jù),,實(shí)現(xiàn)芯片的初始化、寄存器的配置等,。圖4中T_DA為數(shù)據(jù)信號,,TD_VS為場同步信號,TD_HS為行同步信號,。
系統(tǒng)上電時,,I2C配置模塊將對ADV7181B的內(nèi)部寄存器進(jìn)行配置,ADV7181B將模擬信號轉(zhuǎn)換為Y:U:V為42:2:2的8位CCIR656數(shù)字信號,,其中輸出的時序包括行場同步,、行場消隱、行頻場頻及場識別等信號,。
CCD攝像頭采集的圖像實(shí)際尺寸為768×576像素,,每幀圖像由奇場數(shù)據(jù)和偶場數(shù)據(jù)交錯組合而成,奇場數(shù)據(jù)與偶場數(shù)據(jù)在時間上是先后輸入的,。本設(shè)計(jì)使用的是320×240的液晶顯示屏,,在處理過程中也采用的是320×240的圖片格式,所以要對攝像頭采集的圖片進(jìn)行提取,。在設(shè)計(jì)中僅采奇場數(shù)據(jù)的中間240行,,并對每行中間的640個數(shù)據(jù)每兩個像素抽取一個像素,,從而得到符合系統(tǒng)要求的圖像大小。由于一幀圖像的奇場數(shù)據(jù)與偶場數(shù)據(jù)實(shí)際上非常接近,,而每行的相鄰兩個像素值也幾乎沒有差異,,因此可以得到原輸入圖的縮小圖像而不會有失真。
圖像存入SRAM采用了乒乓緩存,,如圖5所示,,是為了防止寫出速度快于寫入速度而導(dǎo)致出現(xiàn)錯誤數(shù)據(jù)。采用兩個行緩存進(jìn)行乒乓切換,,在數(shù)據(jù)提取子模塊向行A寫入數(shù)據(jù)時,,數(shù)據(jù)寫出子模塊讀取行緩存B中的數(shù)據(jù)輸出到總線;在對下一行進(jìn)行采集時,,對行緩存A讀數(shù)據(jù),,對行緩存B寫數(shù)據(jù),。因此行緩存寫路選器與行緩存讀路選器在同一時刻選通的一定是不同的行緩存,。
2 條碼識別核心算法
條碼譯碼主要流程是首先對條碼進(jìn)行自適應(yīng)二值化,然后對條碼進(jìn)行定位,、旋轉(zhuǎn),、分割。分割出單個碼字后,,通過邊緣檢測,,得到條碼條空序列模塊寬度后,再進(jìn)行糾錯解碼,。
傳統(tǒng)條碼識別算法在對條碼定位時多采用Hough變換,,通過Hough變換提取條碼圖像中的直線傾角來旋轉(zhuǎn)條碼。但是Hough變換的大運(yùn)算量并不適用于實(shí)時性要求高的的嵌入式設(shè)備,。筆者結(jié)合PDF417條碼自身的特點(diǎn),,采用4點(diǎn)定位的方法來分割條碼,有效提高條碼識別速度,。核心算法流程詳細(xì)步驟如下:
(1)條碼定位
實(shí)際采集條碼時會出現(xiàn)各種傾斜,,如圖6所示。如何定位條碼是關(guān)鍵的問題,??梢岳脳l碼起始頭特有的比例來定位。按照國標(biāo)的定義,,PDF417二維條碼的起始符黑白條空比是81111113,,終止符黑白條空比是711311121。掃描圖像的每一行,,分別匹配起始符和終止符的條空比,??紤]到條碼采集過程中,邊緣受高斯點(diǎn)擴(kuò)展函數(shù)的影響,,只要黑白條空比例的誤差不超過三位,,可近似認(rèn)為符合比例。標(biāo)記所有符合起始符條空比比例條碼線段,,可以得到4個控制點(diǎn)a,、b、c,、d,,用同樣的方法可以尋找符合終止符條空比的條碼線段,確定點(diǎn)e,、f,、g、h,。判斷a,、c、e,、g是否為正確控制點(diǎn)的標(biāo)準(zhǔn)是,,平行邊長度誤差在5個像素點(diǎn)內(nèi),且相鄰邊角度為90°,,其誤差角度為2°,。
(2)行條碼分割及行高確定
由于PDF417條碼是層疊式條碼,在對單行條碼碼字進(jìn)行識別時,,必須得到條碼的行數(shù),,然后分離出每一行。首先對條碼使用Sobel算子進(jìn)行水平邊緣檢測,,如圖7所示,,然后向水平方向投影,如圖8所示,。
已知p(x)對應(yīng)投影的峰值,,也就條碼的邊界,通過對投影下來的每個值求一次差分▽ p(x),,然后逐個判斷各個差分值,,如果連續(xù)兩個投影的差分值前一個是負(fù)數(shù)而后一個是0或者正數(shù),則說明此點(diǎn)是峰值,。峰值處的坐標(biāo)即為條碼分層的地方,,考慮到條碼層與層連接的地方在二值化時會出現(xiàn)噪點(diǎn),則取每層條碼圖像中間的50%作為有效圖像,。
(3)碼字識別
分割出單個碼字后,,得到條空的像素個數(shù),,記為{M1,M2,,…,,M8},因?yàn)?個條和4個空的總模塊數(shù)為17,,可以根據(jù)式(1)得出條模塊數(shù)的集合{T1,,T2,T3,,T4),。同樣,用Ki替代式(1)中的Ti,,可得到空模塊數(shù)的集合{K1,,K2,K3,,K4},。
因PDF417條碼用了三個簇的數(shù)據(jù)來組成一個條碼,三個簇的數(shù)據(jù)量較大,,且每個簇中的數(shù)據(jù)與條空比無一致對應(yīng)關(guān)系,,所以就涉及把條空比轉(zhuǎn)換成條碼數(shù)據(jù)的問題,。本算法采用的解決方案是:用哈希算法來查找:
F=Z×1400+K2×216+T3×36+K4×6+T (2)
式(2)中Z為空1模塊數(shù)和條2模塊數(shù)的組合,,再利用F的值進(jìn)行查找,實(shí)現(xiàn)數(shù)據(jù)流的譯碼,。數(shù)據(jù)流譯碼不是本文重點(diǎn),,這里不再詳細(xì)闡述。
3 系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)軟件是在Nios II的μC/OSII操作系統(tǒng)下進(jìn)行C語言編程的,。系統(tǒng)初始化主要包括對采集芯片,、射頻傳輸控制模塊、網(wǎng)絡(luò)接口的初始化,,整個系統(tǒng)動態(tài)掃描條碼圖像和實(shí)時譯碼,。系統(tǒng)主要流程如圖9所示。其中,,系統(tǒng)初始化時利用函數(shù)IOWR(SIGNAL_CAP_O_BASE,,O,1)將采集模塊全局信號復(fù)位,,然后使用函數(shù)alt_irq_register,。(SIGNAL_CAP_0_IRQ,NULL,,sig_cap_irq_proc)來建立一個用戶中斷程序,,對按鍵中斷響應(yīng)進(jìn)入中斷服務(wù)程序sig_cap_irq_proc,,向攝像頭發(fā)送采集指令。當(dāng)采集模塊完成一幅條碼圖像采集后,,產(chǎn)生一個硬件中斷,,將標(biāo)志FLAG置1。當(dāng)主循環(huán)程序判斷FLAG為1時,,就可以從外擴(kuò)的SRAM中將圖像數(shù)據(jù)讀入SDRAM中,,接著進(jìn)行圖像預(yù)處理和譯碼,其中包括用自定義用戶指令和硬件模塊實(shí)現(xiàn)的一些運(yùn)算量大的部分,。射頻傳輸與NiosII的PIO口相連,,通過函數(shù)IOWR_ALTERA_AVALON_PIO_DA_TA來實(shí)現(xiàn)。
4 實(shí)驗(yàn)與分析
本識別系統(tǒng)工作頻率為100 MHz,,圖像采樣分辨率為320×240,,一幅條碼圖像識別時間為60 ms。本系統(tǒng)有如下幾個特點(diǎn):
?、倮肞DF417碼本身的特點(diǎn)來定位分割條碼,,與傳統(tǒng)的條碼定位分割算法相比,大大提高了條碼識別速率,。傳統(tǒng)二維條碼定位分割多采用Hough變換來確定條碼傾斜角度,,不能滿足手持式嵌入式條碼識讀器的實(shí)時性要求。
?、谠贔PGA中嵌入NioslI軟核處理器,,簡化硬件設(shè)計(jì),同時使系統(tǒng)更加穩(wěn)定,。FPGA的可重配置以及SOPC的可裁減使系統(tǒng)具有很高的資源利用率,,而且方便升級和維護(hù)。
?、劾米远x模塊,、自定義指令、C2H硬件加速等方法刮對部分耗時算法進(jìn)行優(yōu)化,,大大提高了整個系統(tǒng)識別速率,。
筆者針對不同環(huán)境下采集的300幅條碼圖像進(jìn)行了三次測試:第一次是在條碼無破損的情況下,第二次是在條碼有5%破損和污染的情況下,,第三次隨機(jī)識別100幅條碼,。本文所采用的算法平均識別率達(dá)96.7%,耗時60ms,,如表1所列,。
結(jié) 語
二維條形碼誕生后,條碼技術(shù)的應(yīng)用領(lǐng)域更加廣泛,,不僅應(yīng)用于物流運(yùn)輸,,還滲透到生產(chǎn),、生活的各個領(lǐng)域。本文介紹了一種基于SOPC的二維條碼識別系統(tǒng)的設(shè)計(jì),,提出了一種軟硬件綜合的解決方案,,由于涉及底層的硬件系統(tǒng)設(shè)計(jì)和相應(yīng)的軟件設(shè)計(jì),在系統(tǒng)性能優(yōu)化方面有著很大的空間,。