本發(fā)明屬于信息存儲(chǔ)、定位和識(shí)別技術(shù)領(lǐng)域,涉及一種基于最小二乘法的一維條碼碼字解碼方法。
背景技術(shù):
一個(gè)完整的一維條碼由兩側(cè)靜止區(qū)、起始符、數(shù)據(jù)符、校驗(yàn)符、終止符組成,其結(jié)構(gòu)圖如圖1所示。它將寬度不等的多個(gè)黑條和空白,按照一定的編碼規(guī)則排列,用以表達(dá)一組信息。
常用的條碼掃描設(shè)備通常由光源(比如激光)、光學(xué)透鏡、感光器件(例如CCD,CMOS等)、解碼邏輯電路和I/O接口等組件構(gòu)成。簡單來講,所述光源投射光至條碼上,從條碼處反射的光透過所述光學(xué)透鏡進(jìn)入感光器件表面,經(jīng)過光電轉(zhuǎn)換、模數(shù)轉(zhuǎn)換等一系列處理后形成條碼的數(shù)字圖像,然后解碼邏輯電路對(duì)攝取的圖像進(jìn)行分析和解碼。
現(xiàn)有的一維條碼碼字解碼方法:
1、對(duì)采集的條碼圖像進(jìn)行預(yù)處理(去燥、灰度提取、二值化);
2、定位出條碼區(qū)域;
3、沿條碼方向布置采樣線,得到條碼條空邊界,計(jì)算出條碼每條每空的寬度,記為{a1,a2,a3…}
4、根據(jù)掃描實(shí)測的條碼條空字符寬度計(jì)算相似邊緣距離,記為{b1,b2,b3…};
5、將相似邊緣距離(邊緣差異)或條碼字符條空寬度歸一化為條碼字符模塊寬度的整數(shù)倍,字符條空模塊數(shù)記為{c1,c2,c3…},相似邊緣距離模塊數(shù)記為{e1,e2,e3…};
6、根據(jù)第5步計(jì)算的條空的模塊數(shù)查各條碼編碼字符集或者根據(jù)相似邊緣距離模塊數(shù)查各條碼邊緣差異表,得到條碼起始符,數(shù)據(jù)字符值,結(jié)束符以及有校驗(yàn)時(shí)校驗(yàn)符,解碼結(jié)束。
現(xiàn)有方法的第6步從編碼字符集或者條碼邊緣差異表中找出相對(duì)應(yīng)的字符碼字,一個(gè)碼字由多個(gè)黑白條空組成,以code128碼符號(hào)字符值16(字符集A中為字符“0”)為例,它的條空模塊數(shù){C1,C2,C3,C4,C5,C6}為{1,2,3,1,2,2},相似邊緣距離{E1,E2,E3,E4}為{3,5,4,3,6}這就要求掃描計(jì)算出的條空寬度模塊數(shù)c1、c2、c3、c4、c5、c6分別等于1、2、3、1、2、2,或者計(jì)算出的邊緣差異值e1、e2、e3、e4為3、5、4、3,符號(hào)字符值16的碼字才能解碼成功。但實(shí)際情況中當(dāng)圖像質(zhì)量差的時(shí)候,噪聲干擾、明暗不均、條空邊界模糊、對(duì)比度小等原因使二值化計(jì)算出的條空寬度模塊數(shù)誤差變大,并不是每個(gè)碼字的條空寬度模塊數(shù)或者每個(gè)邊緣差異值都正確,這種情況現(xiàn)有的方法會(huì)造成解碼失敗。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供了一種能大大提高條碼碼字的解碼成功率的基于最小二乘法的一維條碼碼字解碼方法。
本發(fā)明采用的技術(shù)方案是:
一種基于最小二乘法的一維條碼碼字解碼方法,具體步驟如下:
(1)計(jì)算出條碼每個(gè)碼字相似邊緣距離包含的模塊數(shù),先掃描獲取碼字條空實(shí)際寬度為ai={a1,a2,a3,a4,a5,a6…},并計(jì)算得到該碼字的相似邊緣距離包含的模塊數(shù)為ei={e1,e2,e3,e4,e5…},其中ei=ai+a(i+1);
(2)查詢實(shí)際邊緣差異表中正確的碼字包含的模塊寬度數(shù)為Ei={E1,E2,E3,E4,E5…},其中碼字的標(biāo)準(zhǔn)條空模塊數(shù)為Ci={C1,C2,C3,C4,C5,C6…},則Ei=Ci+C(i+1),并計(jì)算ei=Ei的個(gè)數(shù)N;
(3)根據(jù)條碼類型可確定該條碼每個(gè)碼字包含的條和空個(gè)數(shù)和為I,每個(gè)碼字的相似邊緣距離包含的模塊數(shù)個(gè)數(shù)為g,g=I-1;當(dāng)N<g-2或N<=1時(shí),則碼字解碼失??;當(dāng)N>=g-2且N>1時(shí),則進(jìn)入步驟(4);當(dāng)N=g時(shí),選定可能字符F,查F邊緣差異表,進(jìn)行是否為誤碼的相關(guān)計(jì)算,檢查自校驗(yàn)值V是否滿足要求:
(V-1.75)*(p)<(a1+a3+a5+…)<(V+1.75)*(p)/Q;
其中p=a1+a2+a3+a4+a5+…,a1+a3+a5+…是實(shí)際掃描到的碼字所有條寬度和,V為字符F所有條包含標(biāo)準(zhǔn)模塊數(shù)的個(gè)數(shù)之和,Q為一個(gè)碼字具有的模塊個(gè)數(shù);
滿足要求則字符碼字解碼成功,不滿足要求則碼字解碼失?。?/p>
(4)當(dāng)每個(gè)不相等的算式ei≠Ei,不等式兩邊計(jì)算得到的邊緣差異模塊數(shù)與字符邊緣差異表中標(biāo)準(zhǔn)模塊數(shù)兩者的誤差不大于1,該字符選為可能字符,記錄它的符號(hào)值以及對(duì)應(yīng)的條空模塊數(shù),遍歷邊緣差異表,選出所有的可能字符Fi={Fi1,F(xiàn)i2,F(xiàn)i3,F(xiàn)i4,F(xiàn)i5,F(xiàn)i6…};
(5)利用最小二乘法從所有可能字符中選擇誤差Err最小的值為正確的碼字,包括:
1)根據(jù)步驟(1)中掃描獲取的碼字條空實(shí)際寬度為ai={a1,a2,a3,a4,a5,a6…},計(jì)算得到實(shí)際單位模塊的平均寬度M=(a1+a2+a3+a4+a5+a6+…)/Q;
2)將可能字符的條空模塊數(shù)Fi={Fi1,F(xiàn)i2,F(xiàn)i3,F(xiàn)i4,F(xiàn)i5,F(xiàn)i6…}乘以實(shí)際單位模塊的平均寬度M得到可能碼字的條空寬度fi={fi1,fi2,fi3,fi4,fi5,fi6…},
即f1=F1*M={F11*M,F(xiàn)12*M,F(xiàn)13*M,F(xiàn)14*M,F(xiàn)15*M,F(xiàn)16*M…}、f2=F2*M={F21*M,F(xiàn)22*M,F(xiàn)23*M,F(xiàn)24*M,F(xiàn)25*M,F(xiàn)26*M…}…
3)計(jì)算可能碼字的條空寬度值fi與實(shí)際掃描到的條空實(shí)際寬度值ai的誤差Err1,Err2,Err3…
求Err1、Err2、Err3…最小值,其對(duì)應(yīng)的可能碼字的條空寬度值fi就是與掃描到的條空實(shí)際寬度最符合的碼字字符F;
(6)對(duì)步驟(5)得到的碼字字符F進(jìn)行誤碼檢查,通過誤碼檢查則碼字解碼成功,未通過誤碼檢查則碼字解碼失敗。
進(jìn)一步,步驟(6)的誤碼檢查包括:1)檢查自校驗(yàn)值V是否滿足要求;2)根據(jù)實(shí)際情況選定一個(gè)域值θ,誤差Err<θ是認(rèn)為碼字解碼成功,否則認(rèn)為碼字存在誤碼,解碼失敗。
本發(fā)明的有益效果:能大大提高條碼碼字的解碼成功率。
附圖說明
圖1是條碼的結(jié)構(gòu)示意圖。
圖2是本發(fā)明的流程示意圖。
具體實(shí)施方式
下面結(jié)合具體實(shí)施例來對(duì)本發(fā)明進(jìn)行進(jìn)一步說明,但并不將本發(fā)明局限于這些具體實(shí)施方式。本領(lǐng)域技術(shù)人員應(yīng)該認(rèn)識(shí)到,本發(fā)明涵蓋了權(quán)利要求書范圍內(nèi)所可能包括的所有備選方案、改進(jìn)方案和等效方案。
參照圖2,本實(shí)施例以code128碼為例,包括3個(gè)條和3個(gè)空,一個(gè)碼字包含11個(gè)模塊,一種基于最小二乘法的一維條碼碼字解碼方法,具體步驟如下:
(1)計(jì)算出條碼每個(gè)碼字相似邊緣距離包含的模塊數(shù)ei(邊緣差異值),先掃描獲取碼字條空實(shí)際寬度為ai={a1,a2,a3,a4,a5,a6},并計(jì)算得到該碼字的相似邊緣距離包含的模塊數(shù)為ei={e1,e2,e3,e4,e5},其中ei=ai+a(i+1),即e1=a1+a2、e2=a2+a3、e3=a3+a4、e4=a4+a5、e5=a5+a6;
(2)查詢實(shí)際邊緣差異表中正確的碼字包含的模塊寬度數(shù)為Ei={E1,E2,E3,E4,E5},其中碼字的條空模塊數(shù)為Ci={C1,C2,C3,C4,C5,C6},則Ei=Ci+C(i+1),即E1=C1+C2、E2=C2+C3、E3=C3+C4、E4=C4+C5、E5=C5+C6,并計(jì)算ei=Ei的個(gè)數(shù)N;
(3)當(dāng)N<3時(shí),則碼字解碼失??;當(dāng)N>=3時(shí),則進(jìn)入步驟(4);當(dāng)N=5時(shí),選定可能字符F,查F邊緣差異表,進(jìn)行是否為誤碼的相關(guān)計(jì)算,檢查自校驗(yàn)值V是否滿足要求:
(V-1.75)*(p)<(a1+a3+a5)<(V+1.75)*(p)/11;
其中p=a1+a2+a3+a4+a5;V為字符F第1個(gè)條、第2個(gè)條、第3個(gè)條包含模塊個(gè)數(shù)之和;滿足要求則字符碼字解碼成功,不滿足要求則碼字解碼失敗;
(4)當(dāng)每個(gè)不相等的算式ei≠Ei,不等式兩邊計(jì)算得到的邊緣差異模塊數(shù)與字符邊緣差異表中標(biāo)準(zhǔn)模塊數(shù)兩者的誤差不大于1,該字符選為可能字符,記錄它的符號(hào)值以及對(duì)應(yīng)的條空模塊數(shù),遍歷邊緣差異表,選出所有的可能字符Fi={Fi1,F(xiàn)i2,F(xiàn)i3,F(xiàn)i4,F(xiàn)i5,F(xiàn)i6},F(xiàn)1{F11,F(xiàn)12,F(xiàn)13,F(xiàn)14,F(xiàn)15,F(xiàn)16}、F2{F21,F(xiàn)22,F(xiàn)23,F(xiàn)24,F(xiàn)25,F(xiàn)26}、F3{F31,F(xiàn)32,F(xiàn)33,F(xiàn)34,F(xiàn)35,F(xiàn)36}…;
(5)利用最小二乘法從所有可能字符中選擇誤差Err最小的值為正確的碼字,包括:
1)根據(jù)步驟(1)中掃描獲取的碼字條空實(shí)際寬度為ai={a1,a2,a3,a4,a5,a6},計(jì)算得到實(shí)際單位模塊的平均寬度M=(a1+a2+a3+a4+a5+a6)/11;
2)將可能字符的條空模塊數(shù)Fi={Fi1,F(xiàn)i2,F(xiàn)i3,F(xiàn)i4,F(xiàn)i5,F(xiàn)i6}乘以實(shí)際單位模塊的平均寬度M得到可能碼字的條空寬度fi={fi1,fi2,fi3,fi4,fi5,fi6},即f1=F1*M={F11*M,F(xiàn)12*M,F(xiàn)13*M,F(xiàn)14*M,F(xiàn)15*M,F(xiàn)16*M}、f2=F2*M={F21*M,F(xiàn)22*M,F(xiàn)23*M,F(xiàn)24*M,F(xiàn)25*M,F(xiàn)26*M}…
3)計(jì)算可能碼字的條空寬度值fi與實(shí)際掃描到的條空實(shí)際寬度值ai的誤差Err1,Err2,Err3…
求Err1、Err2、Err3…最小值,其對(duì)應(yīng)的可能碼字的條空寬度值fi就是與掃描到的條空實(shí)際寬度最符合的碼字;
(6)對(duì)步驟(5)得到的碼字進(jìn)行誤碼檢查,1)檢查自校驗(yàn)值V是否滿足要求;2)根據(jù)實(shí)際情況選定一個(gè)域值θ,誤差Err<θ是認(rèn)為碼字解碼成功,否則認(rèn)為碼字存在誤碼,解碼失敗。
本發(fā)明對(duì)條碼條空模塊數(shù)存在誤差情況下利用最小二乘法選擇出最符合的碼字,并且設(shè)定誤差大小防止誤碼出現(xiàn),該方法能有效的提高條碼碼字解碼效果和適應(yīng)性。同時(shí)擴(kuò)展了code128碼邊緣差異表,計(jì)算相似邊緣距離寬度模塊數(shù)比計(jì)算字符條空寬度模塊數(shù)容錯(cuò)率高、解碼效果好,一般code128碼商品碼選擇根據(jù)計(jì)算相似邊緣距離寬度模塊數(shù)查找相應(yīng)碼字的方法,計(jì)算相似邊緣距離寬度模塊數(shù)為相鄰條和空模塊數(shù)總寬度,Code128碼現(xiàn)有邊緣差異表沒有對(duì)碼字的第三條黑條和第三白條信息進(jìn)行處理,本發(fā)明將code128碼碼字的第三條黑條和第三白條信息加入到邊緣差異表中,即邊緣差異表{E1,E2,E3,E4}擴(kuò)大為{E1,E2,E3,E4,E5},為code128碼條碼碼字解碼提供更多的信息,提高解碼率。