Data Matrix二维码编码原理及其识别技术
概述
Data Matrix二維碼由美國國際資料公司(International Data Matrix)于1989年發(fā)明,是一種由黑色、白色的色塊以正方形或長方形組成的二維碼,其發(fā)展構(gòu)想是希望在較小的標簽上存儲更多的信息量。DM碼的最小尺寸是目前所有條碼中最小的,特別適合于小零件的的標識,直接印刷在實體上,被廣泛應用在電路、藥品等小件物品以及制造業(yè)的流水線生產(chǎn)過程。
 
 舊版的 Data Matrix 碼包括 ECC000、ECC050、ECC080、ECC100 和 ECC140,而ECC200 是最新的 Data Matrix碼版本,兩者最大差別在于模塊數(shù)目。舊版本的模塊為奇數(shù),而新版本的模塊為偶數(shù)。相比而言,ECC200容錯能力較強,更為常見,以下所說的Data Matrix二維碼特指ECC200。
 
Data Matrix 碼結(jié)構(gòu)
Data Matrix碼由數(shù)據(jù)區(qū)、尋邊區(qū)(finder pattern)和空白區(qū)(quiet zone)組成。數(shù)據(jù)區(qū)包含著編碼信息,包括數(shù)字、字母和漢字等按照一定的編碼規(guī)則生成。每個相同大小的黑色和白色方格稱為一個數(shù)據(jù)單元,分別代表二進制的1和0。尋邊區(qū)包括L型的實心定位標識和反L型的虛線時鐘標識。L型實心定位標識主要用于限定DM碼的物理尺寸、定位和符號失真。反L型虛線邊界主要用于限定單元結(jié)構(gòu),但也能幫助確定物理尺寸及失真。條碼讀取器通過對定位標識與時鐘標識進行圖像處理來檢測位置,可進行 360° 全方位讀取。尋邊區(qū)外層為空白區(qū),寬度至少為1個數(shù)據(jù)單元。
 DM碼總共有24種尺寸規(guī)格,最小尺寸為10×10模塊,最大尺寸為144×144模塊。當模塊數(shù)目超過26×26時將進行分區(qū)塊,每個區(qū)塊不會超過26個模塊。此結(jié)構(gòu)可防止失真。
 
| 10×10 至 26×26 | 1 | 8×8 至 24×24 | 
| 28×28 至 52×52 | 4 | 14×14 至 24×24 | 
| 64×64 至 104×104 | 16 | 14×14 至 24×24 | 
| 120×120 至 144×144 | 36 | 18×18 至 22×22 | 
Data Matrix 碼的實際尺寸的計算方法為符號尺寸乘以模塊的可印刷尺寸。
 例如單元尺寸為 0.25 mm,
 符號尺寸:10 × 10 模塊 = 2.5 × 2.5 mm
 符號尺寸:32 × 32 模塊 = 8.0 × 8.0 mm
 符號尺寸:8 × 18 模塊 = 2.0 × 4.5 mm
編碼規(guī)則
DM碼數(shù)據(jù)區(qū)由相同大小的黑白格子組成,分別代表二進制的1和0,以二維元碼(binary code)方式進行編碼,計算機可直接讀取其數(shù)據(jù)信息。最常見的編碼模式采用ASCII方式,每個編碼單元有8位,代表一個字節(jié)。8個方格組成L型方格陣。
 
 如下圖DM碼編碼的信息為“Wikipedia”,從數(shù)據(jù)區(qū)左上角第5行第1列開始編碼,位于中間區(qū)域的編碼單元都為標準L型,但位于邊緣區(qū)域的編碼單元被分為多個部分,比如首字母W,部分在左邊緣,剩余的部分位于對應右邊緣。兩部分合起來組成標準L型編碼單元。
 另外,在角落中的編碼單元可能組成不同的形狀(非L型)
 
 除了上述ASCII編碼方式,DM編碼還提供了Text、C40、X12、EDIFACT和Base256模式。
| ASCII | 數(shù)字成對編碼 | 4 | 
| ASCII 0-127 | 8 | |
| 擴展ASCII 128-255 | 16 | |
| C40 | 主要為大寫字母和數(shù)字 | 5.33 | 
| Text | 主要為小寫字母和數(shù)字 | 5.33 | 
| X12 | ANSI X12 EDI 數(shù)據(jù)集 | 5.33 | 
| EDIFACT | ASCII 32-94 | 6 | 
| Base 256 | 0-255 范圍的任何數(shù)據(jù) | 8 | 
不同編碼模式可以通過編碼值大小進行切換,默認編碼模式為ASCII(非擴展),編碼值在1~128內(nèi),當編碼值大于128時,將切換到其他編碼模式,比如編碼值為230代表后續(xù)編碼切換到C40編碼模式。
| 0 | Not used | 1–128 | ASCII data (ASCII value + 1) | 
| 129 | End of message | 130–229 | Digit pairs 00 – 99 | 
| 230 | Begin C40 encoding | 231 | Begin Base 256 encoding | 
| 232 | FNC1(GS1標準規(guī)格) | 233 | Structured append. Allows a message to be split across multiple symbols. | 
| 234 | Reader programming | 235 | Upper Shift - Set high bit of the following character | 
| 236 | 05 Macro | 237 | 06 Macro | 
| 238 | Begin ANSI X12 encoding | 239 | Begin Text encoding | 
| 240 | Begin EDIFACT encoding | 241 | Extended Channel Interpretation code | 
| 242–255 | Not used | 
C40、Text和X12編碼模式存儲文字信息更為節(jié)約,將字符編碼范圍約束在0~39,三個字符組合有403=64000種,通過兩個字節(jié)便可完成編碼(2562= 65536)
 V=C1×1600+C2×40+C3+1V = C1×1600 + C2×40 + C3 + 1V=C1×1600+C2×40+C3+1
 B1=floor(V/256)B1 = floor(V/256)B1=floor(V/256)
 B2=Vmod256B2 = V mod 256B2=Vmod256
 其中,C1,C2和C3為編碼前的字符,B1和B2編碼后的字節(jié)表示。單個字符編碼占據(jù)2*8/3=5.33位,B1字節(jié)的結(jié)果值范圍為0~249。當該值設(shè)置為254時,編碼模式換回ASCII方式。詳細編碼方式參考【W(wǎng)iki】Data Matrix。
糾錯能力
Data Matrix碼在一部分損壞時也能夠自動糾錯而不會丟失數(shù)據(jù)。如下圖,即使二維碼出現(xiàn)臟污或部分缺失,仍能正確識別。因而DM碼很適合應用在條碼容易受損的場景,比如印在暴露在高熱、化學清潔劑、機械剝蝕等特殊環(huán)境的零件上。
 DM碼的糾錯復原能力源于數(shù)據(jù)冗余技術(shù),通過對數(shù)據(jù)增加冗余部分來保證當數(shù)據(jù)丟失時能夠一定程度上進行恢復。如下圖所示,DM碼綠色方格代表原始數(shù)據(jù),紅色代表冗余數(shù)據(jù)。
 通常的冗余備份機制有兩類:一類是完全的數(shù)據(jù)備份機制,即鏡像方法,另一類為糾刪碼(erasure code)的方法。鏡像方法又稱為多副本技術(shù),就是把數(shù)據(jù)復制成多個副本分別存儲起來,以實現(xiàn)冗余備份,這種備份方法不涉及專門的編碼和重構(gòu)算法,容錯性能好,但存儲利用率低,當存放N個副本時,磁盤利用率僅為1/N。糾刪碼技術(shù)主要通過利用糾刪算法將原始數(shù)據(jù)進行編碼得到冗余,并將數(shù)據(jù)和冗余一并存儲起來,以達容錯的目的。
 DM碼采用Reed-Solomon編碼(里德-所羅門編碼)糾錯技術(shù),其基本思想給定n個原始數(shù)據(jù)塊(D1,D2,D3,…,Dn),RS編碼根據(jù)這n個數(shù)據(jù)塊計算生成m個冗余元素(校驗塊C1,C2,…,Cm)。從這m+n個數(shù)據(jù)塊中任取n個數(shù)據(jù)塊均能解碼出原始數(shù)據(jù)塊,即對于n個數(shù)據(jù)進行RS編碼后生成n+m個數(shù)據(jù),能夠容忍丟失至多m個數(shù)據(jù)。
 實現(xiàn)的功能聽上去很強大,其實現(xiàn)原理卻十分簡單,其很巧妙地運用了矩陣運算的特點。對于需要進行冗余處理的n個原始數(shù)據(jù),寫成列向量形式(D),左邊生成一個變換矩陣,這個矩陣由n+m行和n列組成,其中上面的n×n的部分是一個單元矩陣,保證原數(shù)據(jù)在編碼后不發(fā)生變化,下面的m×n的部分是一個范德蒙矩陣,生成冗余糾錯數(shù)據(jù)。使用范德蒙矩陣是為了保證這個矩陣任取n×n都部分可逆。
 假設(shè)丟失了m個數(shù)據(jù)(包括原始數(shù)據(jù)和糾錯數(shù)據(jù)),比如下圖中D1、D4和C2丟失,需要從剩余的n個數(shù)據(jù)中恢復出原始數(shù)據(jù)D1 - Dn。從編碼矩陣B中刪除丟失數(shù)據(jù)和丟失編碼對應行,將剩余的數(shù)據(jù)挑出來得到新n×n的矩陣B’。因為編碼矩陣B的任意n行組成的矩陣都可逆,所以根據(jù)剩余的有效數(shù)據(jù)矩陣,即可把中間原始數(shù)據(jù)矩陣D解出來了。
 上面的方法理論上能夠做到數(shù)據(jù)冗余處理,不過由于作為一種編碼技術(shù),RS編碼需要處理的是特定長度的二進制數(shù)據(jù),然而求矩陣逆的過程是在實數(shù)域中進行的。顯然特定長度的二進制是無法準確描述實數(shù)的。因此如何構(gòu)造編碼矩陣B成為關(guān)鍵。為了解決這個問題,RS的計算域采用能夠用二進制精確編碼的伽羅華域GF(2n)(有限域)。與平時熟知的自然域不同,在這個域里會有自己特有的加減乘除等算術(shù)規(guī)則,是基于多項式運算的,更多參考伽羅華域(Galois Field)上的四則運算。這個域的特性就是非常適合處理[0-2n)范圍內(nèi)數(shù)據(jù)的四則運算,而且這里的四則運算大都通過位運算處理,效率比較高。實際為了加快計算的過程,通常采用離散傅里葉變換及其逆變換來進行編碼實現(xiàn)基于伽羅華域傅里葉變換的RS碼識別方法。詳細計算參考 ECC之Reed-Solomon算法
二維碼識別
工業(yè)應用讀碼拍照,如果是絲印噴碼,常見的白底黑碼、或白碼黑底,使用條形光源、環(huán)形光源等,都可以得到比較好的效果。而如果是在一些玻璃上激光打碼,則建議使用同軸光源或高角度的環(huán)形光源。對于這種讀碼的應用,分辨率不需要太高。太高的分辨率,反而不一定能讀取到碼了。所以考慮使用30萬~130萬的工業(yè)相機即可。
 
圖像處理方法
一般來說,從攝像頭或者掃描儀獲得的DM碼圖像通常會包含較多噪聲,且存在角度的傾斜和幾何失真等問題,二維碼圖像識別主要包括圖像預處理、條碼定位和解碼識別。
 由于受實際環(huán)境中圖像采集設(shè)備等影響,捕獲的圖像通常含有較多的噪聲和失真,導致不能譯碼或者錯誤譯碼。為了提高二維碼識別的可靠性,必須對圖像進行有效的預處理。預處理首先對采集的彩色圖像灰度化,在灰度圖上圖像濾波去噪,二值化圖像,進行邊緣提取。圖像的二值化無通用方法,大部分DM解碼器時利用Ostu法等進行處理。
 DM碼可能占據(jù)圖片中很大區(qū)域或者只占據(jù)小部分,因此快速有效地定位出條碼區(qū)域是區(qū)分識別算法優(yōu)劣的關(guān)鍵。利用DM碼外部輪廓為矩形的特點,對圖像進行矩形檢測,可在圖像中初步定位出條碼位置。DM精確定位主要通過尋邊區(qū)L型實線特征實現(xiàn),采用遍歷搜索方法,具體實現(xiàn)方法參考DataMatrix二維條形碼解碼器圖像預處理研究。另一種方法利用距離為角度函數(shù)對條碼邊界進行標記,獲取邊界的位置和旋轉(zhuǎn)角度。最后利用獲取到的角度對條碼進行仿射變換,將條碼旋轉(zhuǎn)到正方位置,進而進行條碼解碼,獲取條碼包含的數(shù)據(jù)信息。
 定位后的DM碼進行圖像取樣,根據(jù)采樣網(wǎng)格將將深淺模塊轉(zhuǎn)換為“1”和“0”矩陣;去除探測圖形,提取出數(shù)據(jù)區(qū),并得到條碼尺寸和版本信息;調(diào)用模塊放置矩陣恢復正確順序的碼字流;再確定數(shù)據(jù)碼字和糾錯碼字,并進行條碼數(shù)據(jù)的檢錯糾錯;最終恢復原始數(shù)據(jù),正確解碼輸出。
基于開源庫實現(xiàn)
Data Matrix核心庫為libdmtx和Zxing
 libdmtx采用的是遍歷方法進行DM碼區(qū)域檢測及定位,至于里面的L形線檢測,也都是遍歷和鄰域檢測的,因為有有效的數(shù)據(jù)結(jié)構(gòu)和網(wǎng)格劃分,速度還是可以的。參考 datamatrix二維碼開源解碼庫libdmtx的原理?
 解碼流程:創(chuàng)建圖像>創(chuàng)建解碼器>尋找DM區(qū)域>DM解碼
 libdmtx庫用到4個主要的結(jié)構(gòu):
- DmtxImage 保存著圖像的屬性以及一個指向像素數(shù)據(jù)的指針,這些像素數(shù)據(jù)保存在調(diào)用的程序里。
- DmtxDecode 保存著控制解碼行為和跟蹤掃描過程的數(shù)值。當掃描一張新的圖像,調(diào)用的程序需要每次重新創(chuàng)建新的DmtxDecode結(jié)構(gòu),而不是重用舊的結(jié)構(gòu)。
- DmtxRegion 以像素坐標定義了一個4邊形的區(qū)域。區(qū)域可以從幾乎任何方向獲得,而且它們的拐角并不需要形成正確的角度。libdmtx 用它自己的結(jié)構(gòu)來保存潛在條碼的位置,程序調(diào)用方每調(diào)用一次獲得一個位置。
- DmtxMessage 保存著從條碼提取出的解碼信息。一個成功解碼的區(qū)域?qū)⒕_地產(chǎn)生一個的信息。
 具體實現(xiàn)參考二維碼Data Matrix簡介及在VS2010中的編譯
參考資料
什么是 Data Matrix 碼?
 DATA MATRIX BARCODE
 【W(wǎng)iki】Data Matrix
 Datamatrix Generator
 糾刪碼(Erasure Code)淺析
 Reed-Solomon糾刪碼簡析
 Erasure Codes for Storage Applications
 ECC之Reed-Solomon算法
 DataMatrix二維條形碼解碼器圖像預處理研究
 二維碼Data Matrix簡介及在VS2010中的編譯
總結(jié)
以上是生活随笔為你收集整理的Data Matrix二维码编码原理及其识别技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MATLAB人脸识别算法
- 下一篇: c语言程序设计二维数组ppt,C语言程序
