張彬彬
(廣東紡織職業(yè)技術(shù)學(xué)院信息工程系,廣東佛山 528041)
條形碼技術(shù)是在計(jì)算機(jī)技術(shù)與信息技術(shù)基礎(chǔ)之上發(fā)展起來的一門融編碼、印刷、識(shí)別、數(shù)據(jù)采集和處理于一身的新興技術(shù)。說起自動(dòng)識(shí)別技術(shù)就必然要提到條形碼,因?yàn)樗诋?dāng)今自動(dòng)識(shí)別技術(shù)中占有重要的地位。自動(dòng)識(shí)別技術(shù)的形成過程是與條形碼的發(fā)明、使用和發(fā)展分不開的。
人們?nèi)粘R姷降挠∷⒃谏唐钒b上的條碼是傳統(tǒng)條碼,這種普通的一維條碼自本世紀(jì)70年代初期問世以來,很快得到了普及和廣泛的應(yīng)用。一維條碼由一組規(guī)則排列的條、空和相應(yīng)的字符組成。條碼信息靠條和空的不同寬度和位置來傳遞,信息量的大小由條碼的寬度和印刷的精度來決定的,條碼越寬,包含的條和空越多,信息量越大;條碼印刷的精度越高,單位長度內(nèi)可以容納的條和空也越多,傳遞的信息里也就越大。這種條碼技術(shù)只能在一個(gè)方向上通過一些“條”與“空”的排列組合來存儲(chǔ)信息,所以叫它“一維條碼”。這種用條、空組成的數(shù)據(jù)編碼可以供機(jī)器識(shí)讀,而且很容易譯成二進(jìn)制數(shù)和十進(jìn)制數(shù)。這些條和空可以由各種不同的組合方法,從而構(gòu)成不同的圖形符號(hào),即各種符號(hào)體系,也被稱碼制,適用于不同場(chǎng)合。
要提高信息密度,一種簡明的方法就是減少條碼的條高,做出一個(gè)很窄很長的條碼,然而這種方法并不實(shí)用,因?yàn)橥ǔS龅降那闆r是在一個(gè)固定面積上印刷出所需信息。這一問題的解決可用兩種方法:一是在一維條碼基礎(chǔ)上向二維條碼方向發(fā)展;二是采用新的集合形體和結(jié)構(gòu)設(shè)計(jì)出二維條碼碼制。在水平和垂直方向的二維空間存儲(chǔ)信息的條碼,稱為二維條碼。因?yàn)樗哂懈呙芏?、大容量等特點(diǎn),所以可以角它來表示數(shù)據(jù)文件 (包括漢字文件)、圖片等。二維條碼是各種證件及卡片等大容童、高可靠性信息實(shí)現(xiàn)存貯攜帶并自動(dòng)識(shí)讀的最理想的方法。
目前已公布的二維條碼碼制有很多種,其中的PDF417層疊式條碼己經(jīng)成為國際通用的二維條碼而且被定為我國二維條碼的標(biāo)準(zhǔn),作為低成本、高速度的便攜數(shù)據(jù)文件,PDF417在管理、運(yùn)輸、證件識(shí)別等方面得到了廣泛的應(yīng)用。
PDF417碼是由留美華人王寅敬博士發(fā)明的。PDF即是取英文Partable Data File三個(gè)單詞的首字母的縮寫,意為“便攜數(shù)據(jù)文件”。因?yàn)榻M成條碼的每一符號(hào)字符都是由4個(gè)條4個(gè)空構(gòu)成,如果將組成條碼的最窄條或空稱為一個(gè)模塊,則上述4個(gè)條4個(gè)空的總模塊數(shù)一定為17,所以稱為417碼或PDF417碼,如圖1所示。
圖1 PDF417二維條碼Fig 1 Two-dimensional bar code
PDF417條碼可表示數(shù)字、字母或二進(jìn)制數(shù)據(jù),也可表示漢字。一個(gè)PDF417條碼最多容納1850個(gè)字符或1108個(gè)字節(jié)的二進(jìn)制數(shù)據(jù),如果只表示數(shù)字則可達(dá)到容納2710個(gè)數(shù)字。PDF417的糾錯(cuò)能力分為9級(jí),級(jí)別越高,糾正能力越強(qiáng)。由于這種糾錯(cuò)功能,使得污損的條碼也可以正確讀出。
PDF417二維條碼生成一開始是從SQL數(shù)據(jù)庫來獲得輸入的原始數(shù)據(jù),然后根據(jù)國家標(biāo)準(zhǔn)來進(jìn)行編碼。
主要是先創(chuàng)建數(shù)據(jù)庫,然后在數(shù)據(jù)庫下建立必需的幾個(gè)表,并設(shè)置好聯(lián)接及主鍵等。
例如應(yīng)用實(shí)例“畢業(yè)生基本信息管理系統(tǒng)”是先創(chuàng)建“StuBaseInfo”數(shù)據(jù)庫并在數(shù)據(jù)庫下建立了三個(gè)表:encouragementandpunishment(獎(jiǎng)勵(lì)懲罰表)、record(成績表)、student(學(xué)生基本信息表),它們之間通過id(學(xué)號(hào))列名來建立聯(lián)接,設(shè)置student(學(xué)生表)的id(學(xué)號(hào))列名為主鍵。數(shù)據(jù)庫設(shè)計(jì)如圖2所示。
本文研究了基于傳感器網(wǎng)絡(luò)的自適應(yīng)參數(shù)估計(jì)問題,提出了一種利用傳感器節(jié)點(diǎn)1比特測(cè)量值的OB-RLS算法。為了降低各節(jié)點(diǎn)的能耗、存儲(chǔ)資源,以及到中心處理器的通信帶寬,首先將各節(jié)點(diǎn)采集的測(cè)量信號(hào)壓縮為1比特?cái)?shù)據(jù),然后再發(fā)送給中心處理器。在中心處理器中,采用文中所提出的OB-RLS算法來獲得對(duì)感興趣參數(shù)的自適應(yīng)估計(jì)。該算法結(jié)合了期望最大化的思想和遞歸最小二乘方法,相比符號(hào)濾波算法和Probit-MLE算法有較低的估計(jì)誤差和較好的穩(wěn)定性,且和傳統(tǒng)RLS算法估計(jì)精度相當(dāng)。論文通過MATLAB仿真實(shí)驗(yàn),驗(yàn)證了算法的性能。
圖2 數(shù)據(jù)庫設(shè)計(jì)Fig 2 The design about database
還要加載數(shù)據(jù)庫,步驟是進(jìn)入控制面板,再雙擊管理工具,再雙擊數(shù)據(jù)源(ODBC),添加類型選MySQL ODBC 3.51 Driver,對(duì)話框中的data source name就輸入stubaseinfo,descprition就輸入student base information,server就輸入localhost,user就輸入root,password就輸入安裝mysql所設(shè)的密碼,最后在database輸入stubaseinfo,設(shè)置好后,單出“TEST”按鈕進(jìn)行測(cè)試連接是否成功,如果成功就可以了。
當(dāng)條碼矩陣的排列定后,就可以確定左、右行指示符號(hào)字符,加上起始符、終止符,然后調(diào)用符號(hào)字符的碼字集,就可以把條碼符號(hào)生成出來。
1)編碼算法流程。本系統(tǒng)的實(shí)現(xiàn)嚴(yán)格按照國家標(biāo)準(zhǔn)實(shí)現(xiàn),對(duì)其中的文本模式下子模式的鎖定和轉(zhuǎn)換的混合型模式到標(biāo)點(diǎn)型模式的鎖定和轉(zhuǎn)換做了個(gè)約定,就是如果在混合型子模式下遇到連續(xù)3個(gè)以上的標(biāo)點(diǎn)型子模式就鎖定為標(biāo)點(diǎn)型子模式,否則(暫時(shí))轉(zhuǎn)換為標(biāo)點(diǎn)型子模式。行高:對(duì)于已經(jīng)達(dá)到推薦的最低錯(cuò)誤糾正等級(jí)的PDF417條碼符號(hào)推薦最小行高為3X。否則為4X。
2)編碼細(xì)節(jié)。文本字模式間的轉(zhuǎn)換與鎖定:
第一,如果一段文本串開頭默認(rèn)鎖定在ALPHA子模式。遇到單字節(jié)字符就用前導(dǎo)碼字BYTESHIFT并且如果前面只有奇數(shù)個(gè)字符被填充的話在BYTESHIFT前加個(gè)輔助字符AL或PS。
第三,其他子模式下遇到PUNCTUATION字符后先判斷是否有連續(xù)3個(gè)以上的PUNCTUATION字符,如果有則鎖定到PUNCTUATION子模式,并且如果前面的模式是MIXED則用PL作前導(dǎo)字符,其他兩種則用ML+PL作前導(dǎo)字符。如果沒有第3個(gè)以上則不用鎖定而只是加上一個(gè)PS作為前導(dǎo)。PUNCTUATION模式下遇到其他子模式的字符則先鎖定到ALPHA子模式,加前導(dǎo)字符PAL,然后再按在ALPHA子模式下處理該字符。
第四,其他子模式下遇到LOWER字符都要鎖定為LOWER子模式并加上前導(dǎo)字符LL。
第五,其他子模式下遇到MIXED字符都要鎖定為MIXED子模式并加前導(dǎo)字符ML。其他子模式下遇到ALPHA字符,如果是LOWER則看看是不是有連續(xù)3個(gè)以上,如果有則鎖定到ALPHA子模式并加前導(dǎo)字符ML+AL,否則不用鎖定到ALPHA子模式,只需加前導(dǎo)字符AS。如果是MIXED則鎖定到ALPHA子模式下并加前導(dǎo)字符AL。
附上輔助字符和前導(dǎo)字符的值:BYTESHIFT 913,PL 25,LL 27,AL 28,ML 28,AS 27,PS 29,PAL 29。
另外,由于必須對(duì)輸入的數(shù)據(jù)進(jìn)行一定的格式處理,也就是用我們自定義的格式來處理為我們想要的數(shù)據(jù)流。本系統(tǒng)采用類似于網(wǎng)絡(luò)鏈路層通信的那種解決沖突的辦法來格式化數(shù)據(jù)流,也就是說,用ESC(0x1B)作為某些個(gè)特殊數(shù)據(jù)的前導(dǎo)符,而ESC則用ESC+ESC來表示,數(shù)據(jù)邏輯分段(項(xiàng)目分段)用ESC+某些標(biāo)志符來標(biāo)記。
標(biāo)志符如下:項(xiàng)目開始(標(biāo)頭開始)ESC+0x01;項(xiàng)目結(jié)束(內(nèi)容結(jié)束)時(shí)用ESC+0x02;項(xiàng)目標(biāo)頭結(jié)束(內(nèi)容開始)ESC+0x03。項(xiàng)目支持列表,也就是說,內(nèi)容可以多項(xiàng),每一項(xiàng)以ESC+0x01開頭和以ESC+0x02結(jié)尾。
1) GetRecord(CString studentID)連接數(shù)據(jù)庫StuBaseInfo,可以用語句:db.Open(NULL,FALSE,FALSE,"ODBC;DSN=StuBaseInfo;UID=root;PWD=b");根據(jù)學(xué)號(hào)獲得學(xué)生記錄。
2) void code(ppdf417 p):該函數(shù)的功能由以下幾個(gè)函數(shù)構(gòu)成。
Void breaktext(ppdf417 p,parraylist list):分段時(shí)以數(shù)字串為分段的點(diǎn),先查找長度大于13的連續(xù)數(shù)字串,然后對(duì)第一段數(shù)字串前面的字符串(如果有的話)、兩個(gè)數(shù)字串之間的字符串和最后一個(gè)數(shù)字串后的字符串進(jìn)行分段。然后再對(duì)合并相鄰的一些段試壓縮編碼的效率更高。段合并的情況如下:兩個(gè)文本串中間一個(gè)單字節(jié)的字節(jié)串合并為一個(gè)文本串;一個(gè)長文本串和相鄰的文本串或者單字節(jié)的字節(jié)串合并為一個(gè)文本串;一個(gè)長字節(jié)串和相鄰的短文本串或者另一個(gè)字節(jié)串合并為一個(gè)字節(jié)串。最后如果只有一個(gè)長度大于或等于8的文本串就將其當(dāng)作一個(gè)數(shù)字串處理。
void assemble(ppdf417 p,parraylist list):按一段一段來壓縮編碼,根據(jù)壓縮編碼類型分為以下3種(前導(dǎo)碼字見源代碼)。
void textcompaction(ppdf417 p,int start,int length):文本壓縮模式是最復(fù)雜的一種壓縮編碼方式,它有4種子模式,并且要處理文本串里夾雜的單字節(jié)。文本壓縮模式最終要的是處理好怎樣標(biāo)識(shí)各種子模式的轉(zhuǎn)換與鎖定。數(shù)據(jù)壓縮上,一個(gè)單字節(jié)用一個(gè)碼字編碼。而其他數(shù)據(jù)則兩個(gè)字符壓縮編碼為一個(gè)碼字。
void numbercompaction(ppdf417 p,int start,int length):數(shù)字壓縮模式即把10進(jìn)制轉(zhuǎn)換為900進(jìn)制以44個(gè)數(shù)字為單位進(jìn)行壓縮。加上前導(dǎo)數(shù)字1剛好45個(gè)字符壓縮為15個(gè)碼字。剩余的數(shù)字同樣加個(gè)前導(dǎo)數(shù)字1再壓縮。大概就是3個(gè)數(shù)字壓縮為一個(gè)碼字。
void bytecompaction(ppdf417 p,int start,int length):字節(jié)壓縮模式即把256進(jìn)制轉(zhuǎn)換為900進(jìn)制。以6個(gè)字節(jié)為單位壓縮為5個(gè)碼字。不足6個(gè)部分按一個(gè)字節(jié)一個(gè)碼字編碼。
void calculatecorrectioncodewords(ppdf417 p,int dest):是根據(jù)錯(cuò)誤控制碼算法:Reed-Solomon來編碼的。
void fillpad(ppdf417 p,intdest): 用TEXT_MODE碼字填充。
void generatepdf417image(ppdf417 p):先填充整個(gè)圖像的左空白區(qū)和右空白區(qū)。然后一行一行填充,每一行先填充開始pattern、計(jì)算并填充左行指示符pattern、接著逐個(gè)填充該行碼字的pattern、最后計(jì)算并填充右行指示符pattern和結(jié)束pattern。并把這一行像素點(diǎn)同樣填充HeightOfBar行。
[1]陳曉平.條碼印制技術(shù)[M].北京:清華大學(xué)出版社,1995.
[2]中國物品編碼中心.條碼技術(shù)與應(yīng)用[M].北京:清華大學(xué)出版社,2003.
[3]黃志建,顧向陽,戴鈞陶.條形碼技術(shù)及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,1992.
[4]齊舒創(chuàng)作室.VC++6.0開發(fā)技巧及實(shí)例剖析[M].北京:清華大學(xué)出版社,1999.
[5]矯云起,張承海.二維條碼技術(shù)[M].北京:中國物價(jià)出版社,1996.
[6]黃以群,董湘陵.條形碼技術(shù)[M].北京:國防工業(yè)出版社,1991.
[7]黃漢如.用PDF417條碼管理運(yùn)費(fèi)抵扣發(fā)票初探[J].條碼信息系統(tǒng),2004,(1).
[8]宋杜生,鐘燕.鐵路行包無憑證提取的條碼信息加密研究[J].條碼信息系統(tǒng),2001,(1):8-10.
[9]張鐸,王耀球.條碼技術(shù)與電子數(shù)據(jù)交換[M].北京:中國鐵道出版社,1998.125-126.
[10]王慶有.圖象傳感器應(yīng)用技術(shù)[M].北京:電子工業(yè)出版社,2003.247-267.
[11]潘松.EDA技術(shù)實(shí)用教程[M].北京:科學(xué)出版社,2002.24.
[12]宋萬杰,羅豐,吳順君.CPLD技術(shù)及其應(yīng)用[M].西安:西安電子科技大學(xué)出版社,1999.76-77.
[13]辛春艷.VHDL硬件描敘語言[M].北京:國防工業(yè)出版社,2002.114.
[14]侯伯亨.VHDL硬件描敘語言與數(shù)字邏輯電路[M].西安:西安電子科技大學(xué),1999.203-204.
[15]趙亮.單片機(jī)C語言編程與實(shí)例[M].北京:人民郵電出版社,2003.144-145,207-209.
[16]楊小平.Visual C++項(xiàng)目案例導(dǎo)航[M].北京:科學(xué)出版社,2002.
[17]戴揚(yáng).PDF417糾錯(cuò)碼原理及實(shí)現(xiàn)[J].吉林大學(xué)學(xué)報(bào),2004,(2).
[18]薛紅.條碼技術(shù)[M].北京:中國輕工業(yè)出版社,2007.