核心提示:1引言 條形碼(簡稱條碼)技術是集條碼理論、光電技術、計算機技術、通信技術、條碼印制技術於一體的一種自動識別技術,條形碼是由寬度不同、反射率不同的條(黑色)和空(白色),一維條形碼生成與識別技術,按照一定的編碼規則編制而成,用以表達一組數字或字母符號信息的圖形標識符,參考文獻1.熊小寒.條形碼技術與標准化[M].天津:
1引言
條形碼(簡稱條碼)技術是集條碼理論、光電技術、計算機技術、通信技術、條碼印制技術於一體的一種自動識別技術。條形碼是由寬度不同、反射率不同的條(黑色)和空(白色),按照一定的編碼規則編制而成,用以表達一組數字或字母符號信息的圖形標識符。條形碼符號也可印成其它顏色,但兩種顏色對光必須有不同的反射率,保證有足夠的對比度。條碼技術具有速度快、准確率高、可靠性強、壽命長、成本低廉等特點,因而廣泛應用於商品流通、工業生產、圖書管理、倉儲標證管理、信息服務等領域。
本文針對EAN-13條碼,介紹了其格式、編碼規則等技術特點,並在Visual C++ 6.0環境下實現了一維條碼的圖像生成與識別,具有較好的應用價值。
2 EAN-13條形碼簡介
一維條碼主要有EAN和UPC兩種,其中EAN碼是我國主要采取的編碼標准。EAN是歐洲物品條碼(European Article Number Bar Code)的英文縮寫,是以消費資料為使用對象的國際統一商品代碼。只要用條形碼閱讀器掃描該條碼,便可以了解該商品的名稱、型號、規格、生產廠商、所屬國家或地區等豐富信息。
EAN通用商品條碼是模塊組合型條碼,模塊是組成條碼的最基本寬度單位,每個模塊的寬度為0.33毫米。在條碼符號中,表示數字的每個條碼字符均由兩個條和兩個空組成,它是多值符號碼的一種,即在一個字符中有多種寬度的條和空參與編碼。條和空分別由1~4個同一寬度的深、淺顏色的模塊組成,一個模塊的條表示二進制的“1”,一個模塊的空表示二進制的“0”,每個條碼字符共有7個模塊。即一個條碼字符條空寬度之和為單位元素的7倍,每個字符含條或空個數各為2,相鄰元素如果相同,則從外觀上合並為一個條或空,並規定每個字符在外觀上包含的條和空的個數必須各為2個,所以EAN碼是一種(7,2)碼。
EAN條碼字符包括0~9共10個數字字符,但對應的每個數字字符有三種編碼形式,左側數據符奇排列、左側數據符偶排列以及右側數據符偶排列。這樣十個數字將有30種編碼,數據字符的編碼圖案也有三十種,至於從這30個數據字符中選哪十個字符要視具體情況而定。在這里所謂的奇或偶是指所含二進制“1”的個數為偶數或奇數[2]。
2.1 EAN-13碼的格式
EAN條形碼有兩個版本,一個是13位標准條碼(EAN-13條碼),另一個是8位縮短條碼(EAN-8條碼)。EAN-13條碼由代表13位數字碼的條碼符號組成,如圖1所示[1]。
圖片看不清楚?請點擊這里查看原圖(大圖)。
圖1 EAN-13碼的格式
前2位( ~ ,歐共體12國采用)或前3位( ~ ,其他國家采用)數字為國家或地區代碼,稱為前綴碼或前綴號。例如:我國為690,日本為49*,澳大利亞為93*等(其中的“*”表示0~9的任意數字)。前綴后面的5位( ~ )或4位( ~ )數字為商品制造商的代碼,是由該國編碼管理局審查批准並登記注冊的。廠商代碼后面的5位( ~ )數字為商品代碼或商品項目代碼,用以表示具體的商品項目,即具有相同包裝和價格的同一種商品。最后一位數字為校驗碼,用以提高數據的可靠性和校驗數據輸入的正確性,校驗碼的數值按國際物品編碼協會規定的方法計算。
2.2 EAN-13條形碼的構成
EAN-13條形碼的構成如圖2所示。
左側 空白 |
起始符 |
左側數據符 6位數字 |
中間 分隔符 |
右側數據符 6位數字 |
校驗符 1位數字 |
終止符 |
右側 空白 |
圖2 典型EAN-13條形碼的構成
(1)左、右側空白:沒有任何印刷符號,通常是空白,位於條碼符號的兩側。用以提示閱讀,准備掃描條碼符號,共有18個模塊組成(其中左側空白不得少於9個模塊寬度),一般左側空白11個模塊,右側空白7個模塊。
(2)起始符:條形碼符號的第一位字符是起始符,它特殊的條空結構用於識別條形碼符號的開始。由3個模塊組成。
(3)左側數據符:位於中間分隔符左側,表示一定信息的條碼字符,由42個模塊組成。
(4)中間分隔符:位於條碼中間位置的若干條與空,用以區分左、右側數據符,由5個模塊組成。
(5)右側數據符:位於中間分隔符右側,表示一定信息的條碼字符,由35個模塊組成。
(6)條碼校驗符:表示校驗碼的條碼字符,用以校驗條碼符號的正確與否,由7個模塊組成。
(7)終止符:條形碼符號的最后一位字符是終止符,它特殊的條空結構用於識別條形碼符號的結束。由3個模塊組成。
一個條形碼圖案是數條黑色和白色線條組成,如圖3所示。
圖3 條形碼圖案實例
圖案分成五個部分,從左至右分別為:起始部分、第一數據部分、中間部分、第二數據部分和結束部分。
(1)起始部分:由11條線組成,從左至右分別是8條白線,一條黑線,一條白線和一條黑線。
(2)第一數據部分:由42條線組成,是按照一定的算法形成的,包含了左側數據符( ~ )這些數字的信息。
(3)中間部分:由5條線組成,從左到右依次是白線,黑線,白線,黑線,白線。
(4)第二數據部分:由42條線組成,是按照一定的算法形成的,包含了右側數據符( ~) 這些數字的信息。
(5)結尾部分:由11條線組成,從左至右分別是一條黑線,一條白線和一條黑線,8條白線。
2.3 EAN-13的編碼規則
EAN-13的編碼是由二進制表示的。它的數據符、起始符、終止符、中間分隔符編碼見表1。
表1 EAN-13編碼
字符 |
二進制表示 |
||
左側數據符 |
右側數據符 |
||
奇性字符(A組) |
偶性字符(B組) |
偶性字符(C組) |
|
0 1 2 3 4 5 6 7 8 9 起始符 中間分隔符 終止符 |
0001101 0011001 0010011 0111101 0100011 0110001 0101111 0111011 0110111 0001011 |
0100111 0110011 0011011 0100001 0011101 0111001 0000101 0001001 0001001 0010111 |
1110010 1100110 1101100 1000010 1011100 1001110 1010000 1000100 1001000 1110100 |
101 01010 101 |
左側數據符有奇偶性,它的奇偶排列取決於前置符,所謂前置符是國別識別碼的第一位 ,該位以消影的形式隱含在左側六位字符的奇偶性排列中,這是國際物品編碼標准版的突出特點。前置符與左側六位字符的奇偶排列組合方式的對應關系見表2,實際上由表2這種編碼規定可看出, 與這種組合方式是一一對應固定不變的。例如:中國的國別識別碼為“690”,因此它的前置符為“6”,左側數據符的奇偶排列為 “OEEEOO”[3],“E”表示偶字符,“O”表示奇字符。
表2 左側數據符奇偶排列結合方式
前置符 |
左側數據符奇、偶排列 |
前置符 |
左側數據符奇、偶排列 |
0 |
O O O O O O |
5 |
O E E O O E |
1 |
O O E O E E |
6 |
O E E E O O |
2 |
O O E E O E |
7 |
O E O E O E |
3 |
O O E E E O |
8 |
O E O E E O |
4 |
O E O O E E |
9 |
O E E O E O |
2.4 EAN-13條形碼的校驗方法
校驗碼的主要作用是防止條形碼標志因印刷質量低劣或包裝運輸中引起標志破損而造成掃描設備誤讀信息。作為確保商品條形碼識別正確性的必要手段,條形碼用戶在標志設計完成后,代碼的正確與否直接關系到用戶的自身利益。對代碼的驗證,校驗碼的計算是標志商品質量檢驗的重要內容之一,應該謹慎嚴格,需確定代碼無誤后才可用於產品包裝上。
下面是EAN-13條形碼的校驗碼驗算方法,步驟如下[3]:
(1)以未知校驗位為第1位,由右至左將各位數據順序排隊(包括校驗碼);
(2)由第2位開始,求出偶數位數據之和,然后將和乘以3,得積 ;
(3)由第3位開始,求出奇數位數據之和,得 ;
(4)將 和 相加得和 ;
(5)用 除以10,求得余數,並以10為模,取余數的補碼,即得校驗位數據值 ;
(6)比較第1位的數據值與C的大小,若相等,則譯碼正確,否則進行糾錯處理。
例如,設EAN-13碼中數字碼為6901038100578(其中校驗碼值為8),該條碼字符校驗過程為:, , = + =82, 除以10的余數為2,故 ,譯碼正確。
3 EAN-13條形碼的生成
條形碼的生成方法如下[3]:
n (1)由 根據表3產生和 ~ 匹配的字母碼,該字母碼有6個字母組成,字母限於A和B。
表3 映射表
字母碼 |
字母碼 |
|
|
0 |
AAAAAA |
5 |
ABBAAB |
1 |
AABABB |
6 |
ABBBAA |
2 |
AABBAB |
7 |
ABABAB |
3 |
AABBBA |
8 |
ABABBA |
4 |
ABAABB |
9 |
ABBABA |
(2
字母碼 |
字母碼 |
|
|
0 |
AAAAAA |
5 |
ABBAAB |
1 |
AABABB |
6 |
ABBBAA |
2 |
AABBAB |
7 |
ABABAB |
3 |
AABBBA |
8 |
ABABBA |
4 |
ABAABB |
9 |
ABBABA |
)將 ~ 和 產生的字母碼按位進行搭配,來產生一個數字--字母匹配對。並通過查表4生成條形碼的第一數據部分。
表4 數字--字母映射表
數字-字母匹配對 |
二進制信息 |
數字-字母匹配對 |
二進制信息 |
0A |
0001101 |
0B |
0100111 |
0C |
1110010 |
1A |
0011001 |
1B |
0110011 |
1C |
1100110 |
2A |
0010011 |
2B |
0011011 |
2C |
1101100 |
3A |
0111101 |
3B |
0100001 |
3C |
1000010 |
4A |
0100011 |
4B |
0011101 |
4C |
1011100 |
5A |
0110001 |
5B |
0111001 |
5C |
1001110 |
6A |
0101111 |
6B |
0000101 |
6C |
1010000 |
7A |
0111011 |
7B |
0010001 |
7C |
1000100 |
8A |
0110111 |
8B |
0001001 |
8C |
1001000 |
9A |
0001011 |
9B |
0010111 |
9C |
1110100 |
(3)將 ~ 和C進行搭配,並通過查表4生成條形碼的第二數據部分。
(4)按照兩部分數據繪制條形碼:1對應黑線,0對應白線。
例如,假設一個條形碼的數據碼為:6901038100578。 =6,對應的字母碼為ABBBAA,~ 和 產生的字母碼按位進行搭配結果為9A、0B、1B、0B、3A、8A,查表4得第一部分數據的編碼分別為0001011、0100111、0110011、0100111、0111101、0110111; ~ 和C進行搭配結果為1C、0C、0C、5C、7C、8C,查表4得第二部分數據的編碼分別為1100110、1110010、1110010、1001110、1000100、1001000。
4 條形碼識別
4.1條碼識別的基本原理
EAN-13是一種(7, 2)碼,即每個字符的總寬度為7個模塊寬,交替由兩個條和兩個空組成,而每個條空的寬度不超過4個模塊,如圖4所示。
圖片看不清楚?請點擊這里查看原圖(大圖)。
圖4 EAN-13條碼寬度的定義
圖4中 表示當前字符中四個相鄰條、空的寬度, 是一個字符的寬度,滿足:, 為整數 ;且 。
用 表示當前字符單位模塊的寬度,則 。令 , 。由 的值可以得到編碼。例如:若 ,且條碼的排列為條—空—條—空,則可知當前字符的編碼為1000100,是右側偶字符7。,且條碼的排列為空—條—空—條,則可知當前字符的編碼為0001011,是左側偶字符9。
由於條碼印刷和圖像采集設備的限制,在圖像采集時邊緣部分還存在着半像素問題,實際掃描后得到的圖像會出現一定程度的邊緣模糊,尤其當條碼密度較大,條空間距較小時邊緣模糊更為明顯。邊緣出現模糊時,將導致尋找條空邊緣時產生一定偏差,當這個偏差超過半個模塊寬度時,便會出現誤碼。如果再考慮到流通過程中磨損、水漬浸泡等因素引起的圖像缺陷,在這種情況下如果用邊緣檢測的方法確定條空序列會大大降低條碼的識別率。本文采用的方法為:以起始模塊的中心為起始中心、一個單位模塊寬度為間距來檢測條空序列。
4.2 條形碼掃描方向的判別
為了能夠正確地解譯條形碼,在解譯條形碼符號所表示的數據之前,需要先進行條形碼掃描方向的判別,EAN-13的起始字符和終止字符的編碼結構都是“101”,只能通過它進行碼制的判別(對於多種條碼識別的時候,其它碼制的條碼起始字符和終止字符都不是“101”),但是不能通過起始字符和終止字符來判別它的掃描方向。由EAN-13碼的編碼結構可知,它的右側字符為全偶,而左側字符的奇偶順序由前置符決定,沒有全偶的,從而可以利用此原理來確定EAN-13碼的掃描方向。如果掃描到的前6個字符為全偶,即為反向掃描,否則為正向掃描。
4.3條形碼字符的判別方法
從上述條碼識別原理知,它的邏輯值可以通過和單位模塊比較判別。這種方法對於印刷質量很好、沒有缺陷的條碼很適用,但是對於條碼印刷質量存在缺陷,則不能正確地解譯。因此本文提出了一種解決此類問題的較好方法,即相似邊距離測量方法。
圖5條碼字符寬度示圖
相似邊距離就是相鄰條和空的寬度之和,如圖5中的 ,定義 的歸一化值 和 如下:
表5列出了正向譯碼時EAN-13條碼字符值與歸一化值 的對應關系,表6列出了反向譯碼時EAN-13條碼字符值與歸一化值 的對應關系,其中“E”表示偶字符,“O”表示奇字符。
表5 EAN-13條碼字符值與歸一化值的對應關系(正向譯碼)
2 |
3 |
4 |
5 |
|||
|
2 |
O6 |
EO |
O4 |
E3 |
|
3 |
E9 |
O2或O8 |
E1或E7 |
O5 |
||
4 |
O9 |
E2或E8 |
O1或O7 |
E5 |
||
5 |
E6 |
O0 |
E4 |
O3 |
表6 EAN-13條碼字符值與歸一化值的對應關系(反向譯碼)
2 |
3 |
4 |
5 |
|||
2 |
E6 |
O0 |
E4 |
O3 |
||
3 |
O9 |
E2或E8 |
O1或O7 |
E5 |
||
4 |
E9 |
O2或O8 |
E1或E7 |
O5 |
||
5 |
O6 |
E0 |
O4 |
E3 |
表7和表8分別為正向譯碼和反向譯碼時EAN-13條碼編碼與歸一化值的對應關系。
表7 EAN-13條碼編碼與歸一化值的對應關系(正向譯碼)
字符 值 |
左奇字符 編碼 |
左偶字符 編碼 |
右偶字符 編碼 |
|||
0 1 2 3 4 5 6 7 8 9 |
0001101 0011001 0010011 0111101 0100011 0110001 0101111 0111011 0110111 0001011 |
(5,3) (4,4) (3,3) (5,5) (2,4) (3,5) (2,2) (4,4) (3,3) (4,2) |
0100111 0110011 0011011 0100001 0011101 0111001 0000101 0010001 0001001 0010111 |
(2,3) (3,4) (4,3) (2,5) (5,4) (4,5) (5,2) (3,4) (4,3) (3,2) |
1110010 1100110 1101100 1000010 1011100 1001110 1010000 1000100 1001000 1110100 |
(5,3) (4,4) (3,3) (5,5) (2,4) (3,5) (2,2) (4,4) (3,3) (4,2) |
表8 EAN-13條碼字符值與歸一化值的對應關系(反向譯碼)
字符 值 |
左奇字符 編碼 |
左偶字符 編碼 |
右偶字符 編碼 |
|||
0 1 2 3 4 5 6 7 8 9 |
1011000 1001100 1100100 1011110 1100010 1000110 1111010 1101110 1110110 1101000 |
(2,3) (3,4) (4,3) (2,5) (5,4) (4,5) (2,2) (3,4) (4,3) (3,2) |
1110010 1100110 1101100 1000010 1001110 1001110 1010000 1000100 1001000 1110100 |
(5,3) (4,4) (3,3) (5,5) (2,4) (3,5) (2,2) (4,4) (3,3) (4,2) |
0100111 0110011 0011011 0100001 0011101 0111001 0000101 0010001 0001001 0010111 |
(2,3) (3,4) (4,3) (2,5) (5,4) (4,5) (5,2) (3,4) (4,3) (3,2) |
由表5~8可以看出,條形碼編碼和歸一化值在多數情況下呈現一一對應的關系,只要確定了歸一化值就能確定字符值,但是有四種情況例外。以正向譯碼為例,在表6中,左側奇字符和右側偶字符1, 7歸一化值均為44,左側奇字符和右側偶字符2, 8歸一化值均為33,左側偶字符1, 7歸一化值均為34,左側偶字符2, 8歸一化值均為43,這幾種情況可以根據字符的條空寬度 進一步判別。表9為1728字符標准條空寬度值,其中字符上有“-”的對應條,否則對應空。
表9 1728字符標准條空寬度值
字符值 |
左奇字符編碼 |
條空寬度值 |
左偶字符編碼 |
條空寬度值 |
右偶字符編碼 |
條空寬度值 |
1 |
0011001 |
|
0110011 |
1100110 |
||
2 |
0010011 |
0011011 |
1101100 |
|||
7 |
0111011 |
0010001 |
1000100 |
|||
8 |
0110111 |
0001001 |
1001000 |
根據表9中各字符條空寬度的特點可知:①對於左側奇字符、右側偶字符1和7,可通過比較與 來判別,若 > ,則為字符1,反之為7;②對於左側奇字符、右側偶字符2和8,可通過比較 與 來判別,若 > ,則為字符8,反之為2;③對於左側偶字符1和7,可通過比較 與 來判別,若 > ,則為字符7,反之為1;④對於左側偶字符2和8,可通過比較 與 來判別,若 > ,則為字符2,反之為8。
采用相似邊距離歸一化的條碼識別方法,當條碼質量存在缺陷使得實際測量值和條碼應該具有的理論值有較大偏差時,仍能正確解譯。例如對於左側奇字符“0”進行譯碼,該字符的四個元素寬度的理論值應該是 ,但是由於印刷等原因的影響,實際上測量值是 。如果只根據元素寬度的測量值進行譯碼,那么這四個元素的寬度測量值四舍五入取整后分別為3、3、1、1,從而造成譯碼錯誤。若采取相似邊距離歸一化的條碼識別方法進行譯碼,此時 ,由表7知字符編碼為左側奇字符“0”。可見利用相似邊距離歸一化的條碼識別方法判別字符值,可以得到比較滿意的效果。
4.4糾錯處理
采用相似邊距離歸一化的譯碼方法能夠在一定程度上消除條、空誤差對譯碼識別的影響。當系統誤差特別是條碼印刷誤差較大導致 、 改變時,譯碼將出錯。因此譯碼軟件應具有一定的糾錯能力,以減少條空寬度值不精確的影響,提高條碼識別率[1]。糾錯主要從以下兩方面進行:
(1)如果條碼字符的 或 在臨界位置,當條或空的寬度有誤差時,就會導致 或 的整數值增1或減1。如果 和 中只有一個發生錯誤,則引起該字符的奇偶性、字符值的改變,如果 和 都出錯,則引起該字符值的改變,但奇偶性未變。實際情況中第一種現象出現的概率比第二種情況大得多,因此本文主要對第一種情況進行糾錯。由表1和表2可知,右側字符為全偶字符排列,左側字符有10種奇偶排列,這11種排列構成有效的排列集合,把所譯的字符串奇偶排列與有效的奇偶排列對比,判斷是否為排列集合成員。若是,所譯的字符串不作任何處理;若不是,所譯碼出錯,並找出 或 哪個處在臨界值,修改它的歸一化整數值,這樣可實現糾錯。
(2)當字符數據為2、8、1、7時,由於條碼寬度不精確導致誤碼,即2判成8、1判成7,或反之。分析這種誤碼相對於校驗位的差值有一定規律,因此可利用此規律進行糾錯。由EAN-13校驗方法知:當偶數位上有2錯譯成8或1錯譯成7時,計算得到的實譯值與校驗值差-8或2,反之8錯譯成2或7錯譯成1時,計算得到的實譯值與校驗值差8或-2;當奇數位上有2錯譯成8或1錯譯成7時,計算得到的實譯值與校驗值差-6或4,反之,8錯譯成2或7錯譯成1時,計算得到的實譯值與校驗值差6或-4;當然別的字符譯錯也可能出現這些差值,但幾率很小,可以不予考慮。這樣若程序校驗沒通過,可加一個判斷,根據差值判斷其屬於上述哪種情況,找出出錯的字符並糾正。
5 程序實現
5.1 應用Visual C++生成條形碼圖像
5.1 1 創建工程文件
(1)打開VC++ 6.0,點擊“File”菜單的“New”菜單項,在出現的界面中選定“Projects”欄,點擊“MFC APPWizard(exe)”,工程文件名為Generator。按“確定”按紐,進入MFC APPWizard。
(2)在MFC APPWizard第一步選擇Single document文檔類型。第二步和第三步按默認方式。第四步中去掉“Docking toolbar”、“Initial status bar”、“Printing and print preview”前面的“√”,即不選該三項。然后點擊“Advanced…”,在出現的界面中填寫“File extension”為“bmp”。第五步和第六步按默認方式。最終生成工程Generator。
(3)修改菜單。①增加“操作”菜單;②刪除“編輯”菜單;③修改“幫助”菜單。參見工程文件。
(4)插入兩個對話框(IDD_WELCOME、IDD_GIVECODE)並修改這兩個對話框。參見工程文件。
5.1.2 類代碼編制
(1)在Generator工程中增加新類CWelcomeDlg,類型為Generic Class。
(2)在Generator工程中增加新類CGiveCodeDlg,類型為Generic Class。
(3)點擊“View”菜單的“ClassWizard”菜單項,在出現的界面中,選擇Class Name為“, CGeneratorView”,增加成員函數,Object Ids、Messages、Member functions分別為:①ID_EDIT_GIVE、COMMAND、ON_ID_EDIT_GIVE:COMMAND;②ID_FILE_SAVE、COMMAND、ON_ID_FILE_SAVE。
(4)給類GeneratorView添加成員變量,參見源程序Generatorview.h。
(5)打開文件GeneratorView.h,增加代碼,參見源程序。打開文件GeneratorView.cpp,增加代碼,參見源程序。
(6)點擊“View”菜單的“ClassWizard”菜單項,在出現的界面中,選擇Class Name為“CWelcomeDlg”,增加成員函數,Object Ids、Messages、Member functions分別為:IDOK、BN_CLICKED、OnOK()。
(7)點擊“View”菜單的“ClassWizard”菜單項,在出現的界面中,選擇Class Name為“CMainFrame”,增加成員函數,Object Ids、Messages、Member functions分別為:CmainFrame、WM_CREATE、OnCreate()。
(8)打開文件MainFrame.cpp,增加“#include "WelcomeDlg.h"”,輸入代碼,參見源程序。
(9)打開GeneratorView.cpp源文件,增加語句“#include "GiveCodeDlg.h" ,#inc, lude "GiveSizeDlg.h", #include <map> ,#include <algorithm>”,輸入成員函數代碼,參見源程序。
(10)編譯、連接、運行。
5.2 應用Visual C++識別條形碼圖像
5.2.1創建工程文件
(1)打開VC++ 6.0,點擊“File”菜單的“New”菜單項,在出現的界面中選定“Projects”欄,點擊“MFC APPWizard(exe)”,工程文件名為Recognizor。按“確定”按紐,進入MFC APPWizard。
(2)MFC APPWizard第一步選擇Single document文檔類型。第二步和第三步按默認方式。第四步中去掉“Docking toolbar”、“Initial status bar”、“Printing and print preview”前面的“√”,即不選該三項。然后點擊“Advanced…”,第四步、第五步和第六步按默認方式。最終生成工程Recognizor。
(3)修改菜單。①修改“文件”菜單;②刪除“編輯”菜單;③修改“幫助”菜單。參見工程文件。
(4)插入一個對話框(IDD_WELCOME),參見工程文件。
5.2.2 類代碼編制
(1)在Recognizor工程中增加新類CWelcomeDlg,類型為Generic Class。
(2)給類RecognizorView添加成員變量,參見源程序Recognizorview.h。
(3)點擊“View”菜單的“ClassWizard”菜單項,在出現的界面中,選擇Class Name為“CRecognizorView”,增加成員函數,Object Ids、Messages、Member functions分別為:ID_FILE_OPEN、COMMAND、ON_ID_FILE_OPEN:COMMAND;
(4)點擊“View”菜單的“ClassWizard”菜單項,在出現的界面中,選擇Class Name為“CMainFrame”,增加成員函數,Object Ids、Messages、Member functions分別為:CmainFrame、WM_CREATE、ON_WM_CREATE;
(5)打開文件MainFrame.cpp,增加“#include "WelcomeDlg.h"”,增加代碼,參見源程序。
(6)打開RecognizorView.cpp源文件,輸入成員函數,參見源程序。
(7)編譯、連接、運行。
6 結論
本文介紹了一維條碼格式、編碼規則等技術特點,以及條碼圖像生成與識別的基本原理,並用Visual C++實現了條碼圖像生成和具有一定糾錯能力的條碼識別軟件。盡管關於一維條碼識別的設備很多,但這些都是針對於光電識別的。光電識別設備只能識別印刷質量好的條碼,而通過圖像處理技術辨識一維條碼能對質量差的條碼達到好的識別效果,因此它明顯優於光電識別設備。
參考文獻
1.熊小寒.條形碼技術與標准化[M].天津:天津大學出版社,1992.
2.李金哲等.條形碼自動識別技術[M].遼寧:科學技術出版社,1993.
3.蘇彥華等.數字圖像識別技術典型案例[M]. 北京:人民郵電出版社,2004.