DataMatrix的代碼結構和QR碼基本相同:

DataMatrix代碼結構
其中Detector的功能還是從原始圖像中找出符號碼的部分,並且進行透視轉換糾正扭曲。
其解碼流程與QR碼差不多,關鍵在於怎么從原始圖像中取出真實的符號圖像。在上文中說過,George Wolberg寫的Digital Image Warping一書中PerspectiveTransform方法可以建立起兩個四邊形之間的映射關系。然后就通過每一點的映射關系將原圖中可能不規則的符號圖形糾正為規則的矩形。
在QR碼中Detector的主要步驟在於找到定位符,在DataMatrix中Detector的關鍵也在於找到四個角的頂點。具體步驟如下:
1、大致划出符號圖像的位置
 
WhiteRectangleDetector(在/core/com/google/zxing/common/detector中)就是用來做這項工作的。它的方法是從圖像中間畫一個30X30的框,然后依次向四邊推行,檢測四邊上是否有黑色的點,直到每一邊都沒有黑色的點為止。如下圖所示是檢測右邊邊框的代碼:
containsBlackPoint函數就是以right為x軸坐標,去檢測從up到down這條線上是否有黑色的點。從上圖中可以看出,代碼就是讓right不斷++,從而使得右邊框不斷向右推移,直到完全推出符號圖像為止。
最終檢測完四條邊就會得到符號圖像的大致位置
檢測圖像大致位置
2、找尋符號圖像四個頂點
  大致范圍確定以后就需要確定符號圖像四個角的頂點,有了四個角的頂點就可以進行透視變換,符號碼圖像也就能夠取出。zxing中首先在大檢測框的四個角用斜45度的直線去檢測,如下圖所示:
檢測圖像大致位置
按照圖中四個角的箭頭所示方向進行掃描,檢測到第一個黑色的點就返回。如果在線上沒有檢測到黑點,就將掃描線向對角線推進。如此就能找到四個角的頂點。
3、確定定位符
DataMatrix的定位符是在符號圖像邊緣的一圈成兩個L形,一個L是實線,一個L是虛線
DataMatrix的定位符
搜索的方法就是沿4條邊的直線進行黑白變換次數的檢測
這里畫直線的方法是使用了bresenham算法(http://zh.wikipedia.org/wiki/Bresenham%E7%9B%B4%E7%B7%9A%E6%BC%94%E7%AE%97%E6%B3%95),該算法在求直線各點的過程中全部以整數來運算,因而大幅度提升計算速度。
黑白變換次數少的就是實線的邊,多的就是虛線的邊,再去找兩個L形的交點,就確定了左下角和右上角這兩點,然后再經過兩點間距離的比較確定出四個頂點。
4、計算緯度並確定符號形狀
緯度就是符號的一邊上有多少個模塊,計算方法就是去找虛線定位符那一邊有多少次黑白變換( DataMatrix的緯度都是偶數,所以要進行誤差修正)。緯度計算出來了就可以知道每個模塊的寬度,再由此就可以計算出四條邊分別有多少個模塊。這樣就可以計算出符號的長寬比,就能夠確定是長方形還是正方形。
最后,就和QR碼相同,使用SampleGrid進行透視變換和采樣變換,將原始圖像中的符號圖像糾正、變換為我們解碼需要的規則的,以模塊為單位的符號矩陣。