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