基于NiosII的二維條碼識別系統(tǒng)設計
2 條碼識別核心算法
條碼譯碼主要流程是首先對條碼進行自適應二值化,然后對條碼進行定位、旋轉、分割。分割出單個碼字后,通過邊緣檢測,得到條碼條空序列模塊寬度后,再進行糾錯解碼。
傳統(tǒng)條碼識別算法在對條碼定位時多采用Hough變換,通過Hough變換提取條碼圖像中的直線傾角來旋轉條碼。但是Hough變換的大運算量并不適用于實時性要求高的的嵌入式設備。筆者結合PDF417條碼自身的特點,采用4點定位的方法來分割條碼,有效提高條碼識別速度。核心算法流程詳細步驟如下:
(1)條碼定位
實際采集條碼時會出現(xiàn)各種傾斜,如圖6所示。如何定位條碼是關鍵的問題??梢岳脳l碼起始頭特有的比例來定位。按照國標的定義,PDF417二維條碼的起始符黑白條空比是81111113,終止符黑白條空比是711311121。掃描圖像的每一行,分別匹配起始符和終止符的條空比??紤]到條碼采集過程中,邊緣受高斯點擴展函數(shù)的影響,只要黑白條空比例的誤差不超過三位,可近似認為符合比例。標記所有符合起始符條空比比例條碼線段,可以得到4個控制點a、b、c、d,用同樣的方法可以尋找符合終止符條空比的條碼線段,確定點e、f、g、h。判斷a、c、e、g是否為正確控制點的標準是,平行邊長度誤差在5個像素點內,且相鄰邊角度為90°,其誤差角度為2°。
(3)行條碼分割及行高確定
由于PDF417條碼是層疊式條碼,在對單行條碼碼字進行識別時,必須得到條碼的行數(shù),然后分離出每一行。首先對條碼使用Sobel算子進行水平邊緣檢測,如圖7所示,然后向水平方向投影,如圖8所示。
已知p(x)對應投影的峰值,也就條碼的邊界,通過對投影下來的每個值求一次差分 p(x),然后逐個判斷各個差分值,如果連續(xù)兩個投影的差分值前一個是負數(shù)而后一個是0或者正數(shù),則說明此點是峰值。峰值處的坐標即為條碼分層的地方,考慮到條碼層與層連接的地方在二值化時會出現(xiàn)噪點,則取每層條碼圖像中間的50%作為有效圖像。
(4)碼字識別
分割出單個碼字后,得到條空的像素個數(shù),記為{M1,M2,…,M8},因為4個條和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ù)與條空比無一致對應關系,所以就涉及把條空比轉換成條碼數(shù)據(jù)的問題。本算法采用的解決方案是:用哈希算法來查找:
F=Z×1400+K2×216+T3×36+K4×6+T (2)
式(2)中Z為空1模塊數(shù)和條2模塊數(shù)的組合,再利用F的值進行查找,實現(xiàn)數(shù)據(jù)流的譯碼。數(shù)據(jù)流譯碼不是本文重點,這里不再詳細闡述。
評論