EAN一13碼的圖像識別系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
2.2.2 左右分割
左右分割是在行方向把條碼分割出來,流程如圖5(b)所示,此流程的設(shè)計(jì)應(yīng)用了條碼的兩個(gè)特征:
(1)條碼的左側(cè)空白區(qū)有11個(gè)模塊,右側(cè)空白區(qū)有7個(gè)模塊;
(2)條碼的起始符為101,結(jié)束符為101。
當(dāng)然圖像一般都會有傾斜,這樣按照x1,x2分割時(shí)會把條碼區(qū)域有用信息分割掉,因此可以加一個(gè)經(jīng)驗(yàn)修正,把x1向左移一點(diǎn),把x2向右移一點(diǎn)。
在檢測101和計(jì)算一個(gè)模塊的長度時(shí),都是通過邊緣間的距離計(jì)算的,由于圖像有變形和扭曲,因此計(jì)算長度是要用平均值和比值。
設(shè)連續(xù)3個(gè)邊緣的距離為L1,L2,L3,當(dāng)0.5L2/L11.5且0.5L3/L21.5時(shí),認(rèn)為檢測到101,且以a=(L1+L2+L3)/3為一個(gè)模塊的長度。按上假設(shè)在條碼中滿足101情況很多,但是同時(shí)滿足101兩側(cè)有固定空白模塊數(shù)的就是惟一的。逐行掃描采用的是從中間行開始分別往上和往下掃描,這樣對于有傾斜的條碼圖像也能分割出部分有用條碼信息,而不需要用hough變換和雙線性差值來對條碼圖像進(jìn)行矯正,減少了處理時(shí)間。得到x1,x2,y1,y2之后就能把條碼分割出來進(jìn)行譯碼。
2.3 譯碼
譯碼過程通過對分割后的二值圖進(jìn)行處理,得到條空的寬度,按照條碼的編碼方式,譯出條碼結(jié)果。譯碼步驟如下:
(1)對二值圖進(jìn)行逐行掃描,檢測邊緣數(shù)是否為60(EAN-13碼有59條空,60個(gè)邊緣),是則記錄下邊緣坐標(biāo),否則把這行舍棄;
(2)根據(jù)每行的邊緣坐標(biāo),算出每個(gè)條空的寬度:為了減小圖像中的條碼扭曲及其他干擾的影響,計(jì)算條空寬度的平均值;
(3)按照如下歸一化方法確定條空歸一化寬度。設(shè)一個(gè)字符(7個(gè)模塊)的寬度為W,條空的平均寬度為Wa,則條空的歸一化結(jié)果Wg由下式確定:
(4)根據(jù)條碼左側(cè)數(shù)據(jù)區(qū)的奇偶性確定前置碼,如表1所示;
(5)根據(jù)前置碼確定左側(cè)數(shù)據(jù)區(qū)的字符集,右側(cè)字符集為C;
(6)根據(jù)數(shù)據(jù)區(qū)條碼的歸一化寬度,查找字符集,根據(jù)表2得出條碼值,譯碼完成;
(7)檢校。
此譯碼流程不僅按照編碼標(biāo)準(zhǔn)快速有效的譯出了條碼,同時(shí)也起到了濾波作用,把有噪聲的行全部濾除,完成精確解碼。按照上述條碼識別的步驟和算法,用Visual C++編寫了程序。圖6展示從一幅帶有條碼的RGB圖到譯碼的全部過程。
3 結(jié)語
對100幅640 x 320圖像進(jìn)行實(shí)驗(yàn),解碼率達(dá)100%,可以說本文的算法和譯碼步驟有著很好的可靠性,對適當(dāng)扭曲和污染并有復(fù)雜背景的條碼圖有著較好的抗干擾性。在此通過對EAN-13碼特征的分析和掌握,設(shè)計(jì)了濾波模板,邊緣檢測模板和圖像提取算法,并實(shí)現(xiàn)了EAN-13碼的譯碼系統(tǒng),通過實(shí)驗(yàn)詳細(xì)描述了整個(gè)解碼過程。此識別系統(tǒng)有以下特點(diǎn):充分考慮了EAN-13碼的特點(diǎn),設(shè)計(jì)了適合該條碼的算法,識讀準(zhǔn)確率高,速度快;此系統(tǒng)架構(gòu)和算法可以很快的應(yīng)用于其他一維碼的圖像識別中;可以很容易的移植到帶有CMOS攝像頭的各個(gè)平臺,實(shí)現(xiàn)基于EAN-13碼的各種應(yīng)用。
評論