二維碼的生成與解碼畢業(yè)設(shè)計_第1頁
二維碼的生成與解碼畢業(yè)設(shè)計_第2頁
二維碼的生成與解碼畢業(yè)設(shè)計_第3頁
二維碼的生成與解碼畢業(yè)設(shè)計_第4頁
二維碼的生成與解碼畢業(yè)設(shè)計_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

北京郵電大學(xué)畢業(yè)設(shè)計緒論1.1論文研究的背景及意義1.1.1論文研究的背景條形碼技術(shù)⑴起源于二次大戰(zhàn)以后。在40年代后期,美國JoewoodLand工程師就開始研究用條碼表示食品項目及相應(yīng)的自動識別設(shè)備,并于1949年獲得了環(huán)形條碼的專利。1970年,美國開始在超市中推廣使用UPC碼。直到1973年,UCC(美國統(tǒng)一編碼協(xié)會)實現(xiàn)了UPC碼制的標(biāo)準(zhǔn)化并建立UPC條碼系統(tǒng)。1974年,美國國防部采用Interme公司推出的39碼作為軍用條形碼碼制。由于39碼是第一個字母、數(shù)字式的條形碼,所以被廣泛應(yīng)用于工業(yè)領(lǐng)域。1977年,歐洲共同體基于UPC-12碼,制定出EAN碼,將其用于歐洲物品編碼。并正式成立了EAN(歐洲物品編碼協(xié)會),后來發(fā)展為IAN(國際物品編碼協(xié)會)。條碼技術(shù)的發(fā)源地是在美國,然而應(yīng)用最廣泛的確是在歐洲。條碼技術(shù)在亞洲的興起比較晚,相比較而言,日本是亞洲最早使用條碼的國家,應(yīng)用和發(fā)展也是最快的。早在1978年,日本加入EAN,然而10年后,日本已成為EAN組織的最大用戶。在我國,直到1988年底,成立“中國物品編碼中心”?!爸袊锲肪幋a中心”于1991年7月1日代表中國加入IAN。推動了條碼技術(shù)開發(fā)和推廣應(yīng)用工作的發(fā)展。在曰常生活中最常見的是條形一維碼,而隨著計算機的發(fā)展,針對一維碼存儲容量不足等缺點,產(chǎn)生了二維碼,并廣泛運用于生活。1.1.2課題研究的意義目前,很難在實際應(yīng)用中找到一套比較完善的、適合中國實際需要的二維碼應(yīng)用系統(tǒng)。很多公司在應(yīng)用二維碼系統(tǒng)時,都存在“硬件投入較大、系統(tǒng)過于龐大、系統(tǒng)架構(gòu)復(fù)雜,不適合修改調(diào)整或穩(wěn)定性及實用性不強”等問題。目前,識別二維碼的設(shè)備基本上采用專用設(shè)備,即使采用手持識別設(shè)備帶來了便捷性,但仍需要專用的計算機設(shè)備完成數(shù)據(jù)采集和處理,這種方式已經(jīng)成了阻礙二維碼應(yīng)用系統(tǒng)的推廣的重要因素。其中本系統(tǒng)的研究意義:1、通過分析二維碼編碼、解碼和糾錯步驟,提出適合中國應(yīng)用的二維碼應(yīng)用系統(tǒng)的架構(gòu)方案。2、設(shè)計符合實際需求的系統(tǒng)內(nèi)部功能模塊,使該系統(tǒng)的友善度、穩(wěn)定性、使用度、識別率以及識別速度都達(dá)到一個比較不錯的水平,適合中國市場。3、本系統(tǒng)直接將識別系統(tǒng)內(nèi)置在智能手機進(jìn)行條碼的識別處理,極大地節(jié)省系統(tǒng)成本,且由于手機可隨時、隨地、隨身攜帶,給用戶提供極大的便捷性。4、通過3G網(wǎng)絡(luò),進(jìn)行數(shù)據(jù)傳輸和數(shù)據(jù)采集,節(jié)省了傳統(tǒng)條碼識別系統(tǒng)采用專用計算機進(jìn)行數(shù)據(jù)處理的開銷,使得系統(tǒng)的運行更加方便和有效。5、由于現(xiàn)代社會當(dāng)中對于手機以及其他電子設(shè)備的依賴性,以及二維碼信息傳遞的便捷性,android手機的普及率,還有社會發(fā)展的快速性,制作一款簡單實用的androidapp,對于市場以及時代發(fā)展都有很重要的意義。1.2課題主要目的本文講述了“針對中國漢字編碼,將一種符合QRCODE標(biāo)準(zhǔn)的二維碼軟件識別系統(tǒng),在智能手機上的設(shè)計和實現(xiàn)”。該二維碼軟件系統(tǒng),在能完成基本采集識別功能的同時,增加了糾錯處理、圖像矯正、多國語轉(zhuǎn)換、網(wǎng)絡(luò)傳輸?shù)裙δ埽瑵M足各種用戶的需求。該產(chǎn)品可以應(yīng)用在多種商務(wù)應(yīng)用中,只要讓該系統(tǒng)鏈接不同的網(wǎng)絡(luò)服務(wù)器就可以實現(xiàn)不同的業(yè)務(wù)處理,使得其市場使用范圍增加。1.3本系統(tǒng)的開發(fā)環(huán)境本系統(tǒng)開發(fā)環(huán)境和工具:開發(fā)平臺:MicrosoftWindows7開發(fā)環(huán)境:eclipseandroid專版開發(fā)工具:android4.4SDK開發(fā)語言:java,android1.4本課題的主要成果及論文結(jié)構(gòu)1.4.1主要成果本系統(tǒng)主要是基于zxing二維碼掃描系統(tǒng)為基礎(chǔ),設(shè)計屬于我們自己的二維碼識別與生成系統(tǒng),功能上實現(xiàn)了二維碼的生成與解碼,并可以在真機上正常運行。功能簡單實用。1.4.2論文的主要結(jié)構(gòu)本文主要結(jié)構(gòu)是綜述,設(shè)計總體概述,系統(tǒng)結(jié)構(gòu)詳解,成果展示,結(jié)論,致謝,外文文獻(xiàn)等部分。綜述主要內(nèi)容是介紹國內(nèi)外二維碼發(fā)展的現(xiàn)狀以及本系統(tǒng)的發(fā)展現(xiàn)狀;系統(tǒng)的結(jié)構(gòu)主要是配置安卓虛擬機環(huán)境,導(dǎo)入zxing二維碼識別的源碼,配置相關(guān)類庫,調(diào)試,以及修改源碼簡化zxing類庫的整個部分,還有增加二維碼生成的部分文件;成果展示是展示本系統(tǒng)完成的結(jié)果,以及可以接下來升級下一版本的需求或者功能;致謝,有關(guān)對于完成本論文整個部分給予我支持和幫助的工作機構(gòu)以及個人致以感謝;參考文獻(xiàn)是完成本次論文一畢業(yè)設(shè)計所參考的各種圖書和論文等文獻(xiàn)資料;外文文獻(xiàn)是相關(guān)文獻(xiàn)的翻譯。其中還有有關(guān)測試的部分,測試和運維是一個長期的部分,伴隨著一個系統(tǒng)的很長時間,據(jù)統(tǒng)計一個系統(tǒng)的整個生命周期有80%的時間都是維護(hù),成本也是相當(dāng)高的,幾乎是整個系統(tǒng)預(yù)算的一半以上。1.5本章小結(jié)本章簡要描述了本課題研究的目的、意義,以及論文的總體組織。下面會結(jié)合系統(tǒng)需求分析提出總體設(shè)計。

2相關(guān)技術(shù)分析2.1android技術(shù)Android是一種以linux為基礎(chǔ)的開放源碼操作系統(tǒng),主要用于編寫手持設(shè)備.目前尚未有統(tǒng)一的中文名稱,中國大陸地區(qū)較多人使用安卓(非官方)或安致(官方)的名稱.Android草紙系統(tǒng)最初由AndyRubin開發(fā),最初主要支持手持設(shè)備.2005年由google收購注資,并聯(lián)合多家制造商組成開發(fā)手機聯(lián)盟開發(fā)改良后,逐漸擴展到平板電腦及其他領(lǐng)域上.2010年末數(shù)據(jù)顯示,僅正式推出兩年的Android操作系統(tǒng)已經(jīng)超越稱霸十年的諾基亞symbian系統(tǒng),粵劇最受歡迎的智能手機平臺.Android的主要競爭對手是同處于手持設(shè)備市場的蘋果IOS,微軟的]WP7以及RIM的BlackberryOS.2007年11月5日,google與其他33家手機制造商(包括摩托羅拉,HTC,三星,LG)、手機晶片供應(yīng)商、軟硬件供應(yīng)商、電信業(yè)者聯(lián)合組成的開放手持裝置聯(lián)盟(簡稱OpenHandsetAlliance),發(fā)布了名為Android的開放手機軟硬件平臺?,F(xiàn)今,OHA是由65間企業(yè)組成的商業(yè)聯(lián)盟,以為移動裝置開放自由標(biāo)準(zhǔn)。在Android平臺公布一周后,google隨即發(fā)布了供開發(fā)者免費自由下載,能在Windows、MacOSX、Linux多平臺上使用的Android軟件開發(fā)工具(SoftwareDevelopmentKit簡稱SDK)與相關(guān)文件。間隔數(shù)天,又在發(fā)布作業(yè)系統(tǒng)核心(kernel),與部分硬件驅(qū)動程式的原始碼,充分展示了google欲將手機這個現(xiàn)代人不可或缺的工具推向開放的平臺,讓開發(fā)者可以自由修改創(chuàng)造出符合用戶需求的手機應(yīng)用的決心。2008年9月24日,T-Mobile收地公布第一臺Android手機(G1)。同日google放出了AndroidSDK1.0rc1。此版本的推出代表了開發(fā)者可以放心的使用API,而不必?fù)?dān)心會有太大的變動。2009年10月26日,又一個主要版本升級以創(chuàng)紀(jì)錄的速度放出。這次,大版本升級到了Android2.1“Eclair.”2011年2月3日凌晨,谷歌正式發(fā)布了專用于平板電腦的Android3.0Honeycomb系統(tǒng)。這是首個基于Android的平板電腦專用操作。首款采用Android3.0系統(tǒng)的是MOTOXOOM。該機是摩托羅拉移動在2011年1月5日,在美國拉斯維加斯CES電子消費展推出的旗下首款平板電腦??梢詮陌姹究闯鯽ndroid的系統(tǒng)在手機市場以很短的時間迅速崛起。也迅速得到眾廠商的認(rèn)可加盟,最后android3.0推出很明顯的標(biāo)示的android系統(tǒng)進(jìn)入MID市場可以看出android將來一段時間的市場主要在手機和平板電腦市場。但是2010年5月19日,在2010GoogleI/O大會上Google公司發(fā)布了它最新的產(chǎn)品——GoogleTV。GoogleTV就是要將網(wǎng)絡(luò)和電視結(jié)合在一起,成為一套新的全家娛樂系統(tǒng)。Android手機可以當(dāng)作Googletv的遙控器使用。這說明google將全面進(jìn)軍物聯(lián)網(wǎng)時代,android可能成為物聯(lián)網(wǎng)時代的主導(dǎo)系統(tǒng)。未來Android會進(jìn)入各行各業(yè),發(fā)展前景無限光明。2.2二維碼2.2.1什么是二維碼二維碼(2-dimensionalbarcode),是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號信息的。在許多種類的二維條碼中,常用的碼制有:DataMatrix,MaxiCode,Aztec,QRCode,Vericode,PDF417,Ultracode,Code49,Code16K等。

1.堆疊式/行排式二維條碼,如,Code16K、Code49、PDF417(如下圖)等。圖2.1行排式二維碼圖2.1行排式二維碼2.矩陣式二維碼,最流行莫過于QRCODE二維碼的名稱是相對與一維碼來說的,比如以前的條形碼就是一個“一維碼”,它的優(yōu)點有:二維碼存儲的數(shù)據(jù)量更大;可以包含數(shù)字、字符,及中文文本等混合內(nèi)容;有一定的容錯性(在部分損壞以后可以正常讀?。?;空間利用率高等。2.2.2國外研究發(fā)展現(xiàn)狀國外對二維碼技術(shù)的研究開始于二十世紀(jì)八十年代。在二維碼符號表示技術(shù)研究方面,已研制出多種碼制,常見的有PDF417,QR碼,Code49,Code16K,CodeOne等。這些二維碼的密度都比傳統(tǒng)的一維條碼有了較大的提高。在二維碼設(shè)備開發(fā)研制、生產(chǎn)各個方面,國外的設(shè)備制造商生產(chǎn)的識讀設(shè)備、符號生成設(shè)備,已廣泛應(yīng)用于各類二維碼應(yīng)用系統(tǒng)。二維碼作為一種全新的信息存儲、傳遞和識別技術(shù),自誕生之日起就得到了世界上許多國家的關(guān)注。2.2.3國內(nèi)研究發(fā)展現(xiàn)狀1993年,國內(nèi)開始對二維碼技術(shù)進(jìn)行研究。中國物品編碼中心對幾種常用的二維碼PDF417,QR碼,DataMatrix,MaxiCode,Code49,Code16K,CodeOne的技術(shù)規(guī)范進(jìn)行了翻譯和跟蹤研究。隨著我國經(jīng)濟(jì)和信息科技技術(shù)的不斷發(fā)展,國內(nèi)對二維碼這一新技術(shù)的需求與日俱增。中國物品編碼中心在國家有關(guān)部門的大力支持下,對二維要碼技術(shù)的研究不斷深入。在消化國外相關(guān)技術(shù)資料的基礎(chǔ)上,制定了GB/T17172-1997《四一七條碼》和GB/T18284-2000《快速響應(yīng)矩陣碼》。為了使二維碼技術(shù)能夠在證照管理領(lǐng)域得到廣泛應(yīng)用,在國外應(yīng)用軟件平臺的基礎(chǔ)上,中國物品編碼中心率先開發(fā)了人像照片和指紋數(shù)據(jù)壓縮軟件。隨著時間的推移、互聯(lián)網(wǎng)的迅猛發(fā)展,手機將成為人們獲取信息用的必備工具。2010年,按官方統(tǒng)計數(shù)字,中國的手機用戶將達(dá)到7.4億,我國移動電話用戶的龐大規(guī)模,為移動增值服務(wù)的發(fā)展提供了堅實的市場基礎(chǔ)。近年來我國移動增值市場年成長率高于60%,規(guī)模不斷擴大。與如此大的市場相比移動增值業(yè)務(wù)種類較少,目前的業(yè)務(wù)遠(yuǎn)遠(yuǎn)滿足不了廣大消費者的需求,擴大增值業(yè)務(wù)的覆蓋面已經(jīng)成為當(dāng)務(wù)之急。鑒于此二維碼技術(shù)就可在移動增值業(yè)務(wù)領(lǐng)域中發(fā)揮出不可替代的重要作用。2.2.4國內(nèi)外發(fā)展對比分析對比國內(nèi)外二維碼產(chǎn)品,不難發(fā)現(xiàn):大部分二維碼系統(tǒng),都使用專用識別設(shè)備進(jìn)行數(shù)據(jù)采集。在這種情況下,要使產(chǎn)品有更廣闊的市場,必須在功能的多元化、操作簡單、識別速度快、可靠性強等方面做改進(jìn)。本產(chǎn)品對傳統(tǒng)二維碼系統(tǒng)做了以下擴展:采用智能手機攝像頭采集二維碼圖像,采用攝像模式,可動態(tài)連續(xù)采集、識別,加快解碼速度。智能手機直接通過3G網(wǎng)絡(luò),與服務(wù)器進(jìn)行數(shù)據(jù)交互,無需采用專用計算機與專用條碼采集設(shè)備進(jìn)行數(shù)據(jù)處理。針對手機攝像頭的特性,加入圖像矯正算法,提高識別率。2.3QR碼的結(jié)構(gòu)與編碼理論2.3.1什么是QRCODEQR碼呈正方形,只有黑白兩色。在3個角落,印有較小,像「回」字的的正方圖案。這三個是幫助解碼軟件定位的圖案,使用者不需要對準(zhǔn),無論以任何角度拍攝,內(nèi)容仍可正確被讀取。日本QR碼的標(biāo)準(zhǔn)JIS

X0510在1999年1月發(fā)布,而其對應(yīng)的ISO國際標(biāo)準(zhǔn)ISO/IEC18004,在2000年6月獲得批準(zhǔn)。根據(jù)DensoWave公司的資料,QR碼是屬于開放式的標(biāo)準(zhǔn),QR碼雖然由DensoWave公司持有的專利,但不會被執(zhí)行。QR(Quick-Response)code是被廣泛使用的一種二維碼,解碼速度快。它可以存儲多用類型。圖2.2QR碼結(jié)構(gòu)圖圖2.2QR碼結(jié)構(gòu)圖 1.位置探測圖形、位置探測圖形分隔符:用于對二維碼的定位,對每個QR碼來說,位置都是固定存在的,只是大小規(guī)格會有所差異;這些黑白間隔的矩形塊很容易進(jìn)行圖像處理的檢測。2.校正圖形:根據(jù)尺寸的不同,矯正圖形的個數(shù)也不同。矯正圖形主要用于QR碼形狀的矯正,尤其是當(dāng)QR碼印刷在不平坦的面上,或者拍照時候發(fā)生畸變等。3.定位圖形:這些小的黑白相間的格子就好像坐標(biāo)軸,在二維碼上定義了網(wǎng)格。4.格式信息:表示該二維碼的糾錯級別,分為L、M、Q、H;5.數(shù)據(jù)區(qū)域:使用黑白的二進(jìn)制網(wǎng)格編碼內(nèi)容。8個格子可以編碼一個字節(jié)。6.版本信息:即二維碼的規(guī)格,QR碼符號共有40種規(guī)格的矩陣(一般為黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本每邊增加4個模塊。7.糾錯碼字:用于修正二維碼損壞帶來的錯誤。2.4QR碼的編碼技術(shù)1.數(shù)據(jù)分析:確定編碼的字符類型,按相應(yīng)的字符集轉(zhuǎn)換成符號字符;選擇糾錯等級,在規(guī)格一定的條件下,糾錯等級越高其真實數(shù)據(jù)的容量越小。

2.數(shù)據(jù)編碼:將數(shù)據(jù)字符轉(zhuǎn)換為位流,每8位一個碼字,整體構(gòu)成一個數(shù)據(jù)的碼字序列。其實知道這個數(shù)據(jù)碼字序列就知道了二維碼的數(shù)據(jù)內(nèi)容。圖2.3二維碼資料容量圖2.3二維碼資料容量圖2.4二維碼提示符圖2.4二維碼提示符數(shù)據(jù)可以按照一種模式進(jìn)行編碼,以便進(jìn)行更高效的解碼,例如:對數(shù)據(jù):01234567編碼(版本1-H),1)分組:012345672)轉(zhuǎn)成二進(jìn)制:012→0000001100345→010101100167→10000113)轉(zhuǎn)成序列:0000001100010101100110000114)字符數(shù)轉(zhuǎn)成二進(jìn)制:8→00000010005)加入模式指示符(上圖數(shù)字)0001:00010000001000000000110001010110011000011對于字母、中文、日文等只是分組的方式、模式等內(nèi)容有所區(qū)別?;痉椒ㄊ且恢碌?/p>

3.糾錯編碼:按需要將上面的碼字序列分塊,并根據(jù)糾錯等級和分塊的碼字,產(chǎn)生糾錯碼字,并把糾錯碼字加入到數(shù)據(jù)碼字序列后面,成為一個新的序列。 在二維碼規(guī)格和糾錯等級確定的情況下,其實它所能容納的碼字總數(shù)和糾錯碼字?jǐn)?shù)也就確定了,比如:版本10,糾錯等級時H時,總共能容納346個碼字,其中224個糾錯碼字。就是說二維碼區(qū)域中大約1/3的碼字時冗余的。對于這224個糾錯碼字,它能夠糾正112個替代錯誤(如黑白顛倒)或者224個據(jù)讀錯誤(無法讀到或者無法譯碼),這樣糾錯容量為:112/346=32.4%

4.構(gòu)造最終數(shù)據(jù)信息:在規(guī)格確定的條件下,將上面產(chǎn)生的序列按次序放如分塊中按規(guī)定把數(shù)據(jù)分塊,然后對每一塊進(jìn)行計算,得出相應(yīng)的糾錯碼字區(qū)塊,把糾錯碼字區(qū)塊按順序構(gòu)成一個序列,添加到原先的數(shù)據(jù)碼字序列后面。如:D1,D12,D23,D35,D2,D13,D24,D36,...D11,D22,D33,D45,D34,D46,E1,E23,E45,E67,E2,E24,E46,E68,...5.構(gòu)造矩陣:將探測圖形、分隔符、定位圖形、校正圖形和碼字模塊放入矩陣中。把上面的完整序列填充到相應(yīng)規(guī)格的二維碼矩陣的區(qū)域中

6.掩摸:將掩摸圖形用于符號的編碼區(qū)域,使得二維碼圖形中的深色和淺色(黑色和白色)區(qū)域能夠比率最優(yōu)的分布。一個算法,不研究了,有興趣的同學(xué)可以繼續(xù)。

7.格式和版本信息:生成格式和版本信息放入相應(yīng)區(qū)域內(nèi)。版本7-40都包含了版本信息,沒有版本信息的全為0。二維碼上兩個位置包含了版本信息,它們是冗余的。版本信息共18位,6X3的矩陣,其中6位時數(shù)據(jù)為,如版本號8,數(shù)據(jù)位的信息時001000,后面的12位是糾錯位。圖2.5QR二維碼 圖2.5QR二維碼2.5.本章小結(jié)本章主要介紹了本課題所涉及的各項技術(shù),分析了各技術(shù)的起源、歷史、現(xiàn)狀以及發(fā)展前景,有些分析比較了國內(nèi)外相關(guān)技術(shù)的差距,很有時代與實際意義。

3二維碼android手機識別系統(tǒng)設(shè)計3.1需求分析3.1.1概述基于無線互聯(lián)網(wǎng)的發(fā)展,為提高智能手機用戶輸入的便捷性,而進(jìn)行基于智能手機二維碼識別系統(tǒng)的研發(fā),從而提高用戶上網(wǎng)效率。為該系統(tǒng)設(shè)計提供依據(jù),特做此需求分析。本章基于智能手機二維碼識別系統(tǒng)的可能應(yīng)用場景,提取并分析出本系統(tǒng)的基本用戶需求,確定了本系統(tǒng)的功能性需求和非功能性需求,從而也決定了該系統(tǒng)運行的軟、硬件環(huán)境,以便下一階段對本系統(tǒng)進(jìn)行系統(tǒng)設(shè)計。課題相關(guān)信息:1.待開發(fā)系統(tǒng)名稱:基于智能手機二維碼識別系統(tǒng)2.本項目的任務(wù)提出者:項目經(jīng)理3.開發(fā)者:基于智能手機二維碼識別系統(tǒng)研發(fā)組4.預(yù)期用戶:具有智能手機的所有用戶為方便閱讀,本課題對相關(guān)術(shù)語的定義進(jìn)行描述:1.二維碼:QRcode二維碼等主流二維編碼都可以,利用水平方向和垂直方向圖像單元存儲數(shù)據(jù)的圖形圖像。2.智能手機:SmartPhone,具有開放接口的、就是一臺可以隨意安裝和卸載應(yīng)用軟件的手機,通過開放接口開發(fā)并安裝的軟件,可以擴展智能手機的功能。3.攝像頭:Camera。本文所指攝像頭皆為智能手機所內(nèi)置的攝像頭。3.1.2任務(wù)概述(1)任務(wù)目標(biāo):開發(fā)本系統(tǒng)目的是為了智能手機用戶更加快捷地上網(wǎng),本系統(tǒng)利用了智能手機所具有的攝像頭結(jié)合二維碼進(jìn)行網(wǎng)址解析,從而減輕了用戶記憶大量網(wǎng)址的記憶量,也節(jié)約了用戶輸入網(wǎng)址的時間。用戶特點:本系統(tǒng)最終用戶使用的智能手機具有攝像頭并且建議攝像頭分辨率在一百萬像素以上最好具有自動對焦功能,微距功能更佳,以便能獲取更加清晰的二維碼,使得識別成功率增加,縮短識別時間;另外,該用戶有上網(wǎng)需求。(2)運行環(huán)境:本系統(tǒng)客戶端,運行在android智能手機設(shè)備中,本系統(tǒng)測試手機具體為魅族mx2手機。假設(shè)和依賴:本系統(tǒng)要正常運行,必須保證對應(yīng)的網(wǎng)址已經(jīng)編碼成二維條形碼、并打印在相關(guān)媒介上,所采用的編碼格式與本系統(tǒng)解碼格式及版本一致,條形碼的污損率不能低于相應(yīng)編碼所規(guī)定的污損率,否則將會影響解碼糾錯效果,直接導(dǎo)致降低識別率。另外,使用本系統(tǒng)正確解碼上網(wǎng),必須保證識別二維碼的場景光線效果比較好,至少保證二維條碼各部分顏色比較均勻,明暗對比度不能太強烈,否則也會影響識別率。使用本系統(tǒng),需要保證智能手機攝像頭分辨率最好在一百萬像素以上,最好具備自動對焦或微距功能。使用本系統(tǒng),必須保證手機具有足夠的電量。3.1.3需求規(guī)定系統(tǒng)的功能需求描述如下表所示:表3.1系統(tǒng)功能需求表序號功能點描述輸入處理輸出功能1用戶界面通過本界面實現(xiàn)人機交互用戶菜單操作響應(yīng)用戶操作根據(jù)用戶輸入菜單命令做處理功能2視頻采集在本系統(tǒng)客戶端內(nèi)具有視頻采集功能,完成二維碼圖像拍攝功能二維碼原始圖像將攝像頭獲取到二維碼圖像轉(zhuǎn)換成識別模塊需要的位圖信息位圖信息功能3圖像處理模塊將視頻采集模塊采集的二維碼圖像,進(jìn)行黑白二值化處理二維碼位圖信息根據(jù)RGB圖轉(zhuǎn)換成灰度圖,然后轉(zhuǎn)換成黑白二值圖黑白二值圖功能4圖像識別(定位點識別)通過二維碼定位點的特征,采用模式識別的方法將二維碼從背景圖中截取出來黑白二值圖依據(jù)QR標(biāo)準(zhǔn),利用識別算法確定定位點位置與個數(shù),從而判定是否存在對應(yīng)的二維碼,如果存在則將其從背景圖中截取其數(shù)據(jù)識別后處理后的點陣數(shù)據(jù)功能5數(shù)據(jù)解碼將二維碼點陣數(shù)據(jù)通過處理,解析出其中數(shù)據(jù),識別出對應(yīng)的網(wǎng)址圖形識別部分確定的定位點等特征信息按照定位點位置,根據(jù)編碼標(biāo)準(zhǔn),獲取版本號,從而構(gòu)建采樣網(wǎng)格,從而解析數(shù)據(jù)內(nèi)容編碼在二維碼中的網(wǎng)址信息功能6二維碼生成模塊寫入數(shù)據(jù),然后依據(jù)內(nèi)置算法,生成二維碼圖像,并分享要生成的字符,網(wǎng)址等內(nèi)置算法,生成二維碼二維碼圖像系統(tǒng)的外部接口需求包括用戶界面、硬件接口、軟件接口、通信接口。用戶界面:為方便用戶使用本軟件,本系統(tǒng)所采用的用戶界面風(fēng)格簡約,符合智能手機用戶使用習(xí)慣。主界面只包括一個攝像頭獲取界面,啟動后,用戶只需要將攝像頭對準(zhǔn)二維碼,即可在主界面直接預(yù)覽到二維碼圖片內(nèi)容,如果解碼成功,則直接轉(zhuǎn)到瀏覽器界面上網(wǎng);若解碼失敗,則提示用戶重新調(diào)整手機攝像頭位置,開始重新獲取二維碼圖片內(nèi)容并重復(fù)解析識別。硬件接口:本系統(tǒng)需要的硬件主要包括攝像頭,安裝本軟件的智能手機必須內(nèi)置攝像頭,攝像頭分辨率必須在一百萬像素以上,否則將會延長識別時間、降低識別率,從而影響識別效果軟件接口:攝像頭具有軟件接口,操作系統(tǒng)能提供接口,直接從攝像頭獲取視頻或者拍照模式的照片位圖信息,方便本系統(tǒng)的客戶端應(yīng)用程序調(diào)用。通信接口:本系統(tǒng)所在的手機具備上網(wǎng)功能,能支持Wap等協(xié)議上網(wǎng)。系統(tǒng)的非功能性需求包括識別率、時間性能要求、輸入輸出要求。識別率:要求識別率越高用戶體驗越好,如果低于50%,則用戶體驗下降??梢圆捎锰岣邤z像頭分辨率,優(yōu)化圖像矯正算法來提高識別率。時間性能要求:本系統(tǒng)軟件啟動:無特殊時間要求,與手機硬件設(shè)備相關(guān)。識別結(jié)果響應(yīng)時間:識別成功與失敗,都應(yīng)該控制在1秒鐘以內(nèi)。輸入輸出要求:(1)輸入:要求被識別的二維碼圖像盡可能完整,污損率在國標(biāo)范圍內(nèi);拍攝識別場景,盡量光線比較好,使得顏色均勻;攝像頭分辨率盡量大于一百萬像素,能獲取1024×768尺寸圖片。(2)輸出:采用瀏覽器輸出對應(yīng)網(wǎng)站數(shù)據(jù)內(nèi)容,需要手機內(nèi)置瀏覽器并可以通過本系統(tǒng)軟件啟動;輸出提示信息簡潔明了。3.2系統(tǒng)設(shè)計3.2.1概述針對基于智能手機二維碼識別系統(tǒng)的需求分析,對系統(tǒng)進(jìn)行了總體設(shè)計和規(guī)劃,劃分了系統(tǒng)架構(gòu)及功能模塊,為后續(xù)各個功能模塊的設(shè)計做好準(zhǔn)備。3.2.2編寫目的本章根據(jù)用戶需求分析的結(jié)果,從系統(tǒng)全局出發(fā),進(jìn)行了總體設(shè)計,確定了本系統(tǒng)的總體架構(gòu),并劃分了各個功能實現(xiàn)的具體模塊,為后續(xù)模塊設(shè)計和編碼實現(xiàn)提供了指導(dǎo)和依據(jù)。3.2.3定義(1)模式識別PatternRecognition。計算機運用數(shù)學(xué)方法來研究模式的自動處理和判讀。把環(huán)境和客體統(tǒng)統(tǒng)稱之為“模式”。計算機技術(shù)不斷的發(fā)展,人們研究復(fù)雜的信息處理過程成為了可能。信息處理過程的一個重要形式是生命體對環(huán)境及客體的識別。對人類而言,最為重要的是對光學(xué)信息和聲學(xué)信息的識別。這是模式識別的兩個重要方面。(2)圖像矯正ImageCorrection。通過攝像頭獲取到的圖像,可能與真實圖像之間存在一些偏差,對于本系統(tǒng)的二維碼而言,主要是產(chǎn)生了形變,本文所指圖像矯正,是對通過攝像頭獲取的二維碼進(jìn)行形狀糾正的算法及過程。3.2.4總體設(shè)計首先分析了基于智能手機的二維碼識別系統(tǒng)的基本操作流程,然后根據(jù)本系統(tǒng)的需求分析的結(jié)果,進(jìn)行總體設(shè)計。(1)基本設(shè)計概念與處理流程啟動智能手機中安裝的本系統(tǒng)時,攝像頭獲取圖像并顯示在手機屏幕中部,視點處于屏幕中部,若用戶對準(zhǔn)了二維條形碼,則自動開始進(jìn)行識別處理,若識別成功并且所含編碼為有效的網(wǎng)絡(luò)地址URL,則啟動手機瀏覽器連接該網(wǎng)站進(jìn)行網(wǎng)絡(luò)瀏覽;若識別失敗或者編碼內(nèi)容無效,則提示用戶。若距離二維條形碼較遠(yuǎn)或者智能手機攝像頭鏡面和二維條形碼所在平面不平行時,可能導(dǎo)致識別失敗,則用戶需要調(diào)整識別角度,重新進(jìn)行識別。(2)基本物理對象從上面的操作需求而已得出本系統(tǒng)需要處理的數(shù)據(jù),包括以下兩方面。(3)二維條形碼原始圖像由攝像頭獲取二維條形碼原始圖像,并顯示在智能手機屏幕上,以便用戶進(jìn)行距離及位置的調(diào)整。(4)二維條形碼的幾何數(shù)據(jù)由于攝像頭與二維條形碼平面不一定絕對平行,所以拍攝的二維條形碼的形狀,可能為正方形、菱形或者梯形,距離較遠(yuǎn)或者二維條形碼有污損的情況下,還可能出現(xiàn)拍攝的原始圖像為其它形狀的情況。(5)系統(tǒng)層次劃分圖3.1系統(tǒng)層次圖3.1系統(tǒng)層次整個系統(tǒng)共分為5層,分別為:物理硬件層、android系統(tǒng)層、圖像捕獲和處理層、QRCode解碼生成層以及用戶界面。(a)物理硬件層本層是智能手機物理硬件。硬件層,提供了包括支持整個系統(tǒng)所必需的硬件模塊,包括:攝像頭、網(wǎng)絡(luò)數(shù)據(jù)收發(fā)裝置、手機操作系統(tǒng)運行環(huán)境等。(b)android系統(tǒng)層提供了對底層硬件模塊訪問的封裝,它向上層應(yīng)用程序提供了訪問底層模塊的接口和整個系統(tǒng)運行所必需的軟件環(huán)境。(c)圖像捕獲和處理模塊層圖像捕獲模塊,完成對QRCode圖形的獲取,包括通過攝像頭拍照和攝像兩種方式,并且將所捕獲的圖形轉(zhuǎn)換成QRCode解碼層所能處理的數(shù)據(jù)格式。網(wǎng)絡(luò)處理模塊,負(fù)責(zé)將解碼后的數(shù)據(jù)還原后,獲取其中的網(wǎng)址,并通過網(wǎng)絡(luò)協(xié)議鏈接對應(yīng)網(wǎng)站獲取數(shù)據(jù)。(d)QRCode數(shù)據(jù)解碼層完成對QRCode圖形的解碼操作,包括:圖像采集、圖像識別、圖像預(yù)處理、圖形矯正、糾錯的解碼處理,二維碼生成。(e)用戶操作界面為直接面向移動用戶的操作界面,用戶可以通過界面操作完成對整個系統(tǒng)的控制。(6)子系統(tǒng)劃分需要從攝像頭獲取二維碼圖像數(shù)據(jù),但是我們采用的智能手機已經(jīng)具備攝像頭,并且可以利用手機廠商公開在開發(fā)包SDK中的接口類來獲取數(shù)據(jù),所以該部分,直接有驅(qū)動層和硬件層實現(xiàn),本系統(tǒng)設(shè)計中,不需要做過多處理。所以本系統(tǒng)主要功能模塊劃分為三個部分:用戶操作界面,圖像捕獲和網(wǎng)絡(luò)處理模塊層以及數(shù)據(jù)解碼層。另外,為了用戶使用本系統(tǒng)簡捷方便,所以用戶界面比較簡單,用戶界面模塊顯示從攝像頭獲取到的預(yù)覽數(shù)據(jù),調(diào)用圖像處理模塊進(jìn)行圖像識別處理,成功后,再調(diào)用數(shù)據(jù)解密模塊完成二維碼圖像的解析,最后通過解析出的網(wǎng)址啟動手機內(nèi)置瀏覽器直接上網(wǎng)。本系統(tǒng)核心功能模塊在于:圖像處理模塊和數(shù)據(jù)解碼生成模塊。(7)模塊功能和處理流程下表對本系統(tǒng)各個功能模塊進(jìn)行了描述:表3.2系統(tǒng)功能模塊表序號功能點輸入處理輸出備注1用戶界面用戶菜單調(diào)用其他模塊提示信息或解碼或生成信息2圖像采集攝像頭數(shù)據(jù)獲取攝像頭數(shù)據(jù)轉(zhuǎn)換成位圖像素數(shù)據(jù)位圖信息3圖像預(yù)處理二維碼圖像數(shù)據(jù)矯正處理二維碼位圖數(shù)據(jù)4圖像識別(定位點識別)二維碼二值化圖像數(shù)據(jù)根據(jù)QR標(biāo)準(zhǔn)尋找圖像中定位點,將QR圖從背景圖中截取二維碼有效區(qū)域數(shù)據(jù)5核心解碼二維碼有效區(qū)域數(shù)據(jù)根據(jù)定位點和版本信息,依據(jù)QR標(biāo)準(zhǔn),構(gòu)建采樣網(wǎng)格二維碼有效數(shù)據(jù)6糾錯二維碼有效數(shù)據(jù)根據(jù)相關(guān)算法進(jìn)行糾錯處理編碼時輸入的信息7圖像分享分享信息調(diào)用android虛擬機分享分享8二維碼生成模塊要生成的字符,網(wǎng)址等內(nèi)置算法,生成二維碼二維碼圖像以上模塊中,核心算法集中在以下兩大模塊中:(1)圖像處理模塊該模塊主要功能是實現(xiàn)將攝像頭獲取的二維碼圖像數(shù)據(jù),經(jīng)過圖像預(yù)處理、定位點識別,識別出所拍攝圖像中,是否含有而為碼圖像。如果含有,則將二維碼原圖根據(jù)三個定位點所圍成區(qū)域截取出來,將數(shù)據(jù)發(fā)送給數(shù)據(jù)解碼模塊進(jìn)行數(shù)據(jù)解析。(2)數(shù)據(jù)解碼模塊該模塊接收圖像處理模塊發(fā)送到二維碼數(shù)據(jù),通過定位點構(gòu)建采樣網(wǎng)格,經(jīng)過核心解碼部分處理后,得到二維碼中的編碼信息;然后將編碼信息經(jīng)過糾錯模塊處理,本編碼采用的是里德所羅門糾錯算法。功能需求與系統(tǒng)模塊的關(guān)系功能功能名稱模塊1模塊2模塊3模塊4模塊5模塊6模塊7模塊81用戶界面√2視頻采集√3圖像處理√√4圖像識別√5數(shù)據(jù)解碼√√√6二維碼生成√表3.3功能需求與系統(tǒng)模塊關(guān)系表因為手機需要手持,所以在識別二維碼過程中,手持的智能手機攝像頭與二維碼所在的平面,不一定保證平行。當(dāng)兩個平面夾角較小的時候,可以通過矯正算法將拍攝的圖像進(jìn)行矯正,但是,如果偏角比較大,拍攝的二維碼圖像形變比較嚴(yán)重時,即使通過矯正算法,也很難將所有圖像矯正并識別成功,所以,這時需要人工將手機角度矯正,盡量保持與二維碼所在平面平行。尚未解決的問題1.當(dāng)手機攝像頭與二維碼平面夾角過大時,通過現(xiàn)有矯正算法很難矯正,并識別成功;2.當(dāng)待識別的二維碼印刷面積過小時,每個模塊所占的像素過小,則可能導(dǎo)致識別失??;3.2.5運行設(shè)計運行模塊組合本系統(tǒng)所運行的智能手機操作系統(tǒng)是android,開發(fā)平臺是魅族mx2,并且具備攝像頭。(1)檢測到二維碼且成功解碼當(dāng)用戶手持安裝有本系統(tǒng)的手機,啟動后,即開始進(jìn)行設(shè)想模式的識別和解碼,如果檢測到被拍攝平面有二維碼的定位點,且三個定位點位置符合編碼規(guī)范的位置關(guān)系,則開始進(jìn)行圖像預(yù)處理、糾錯和解碼,解碼成功,則啟動瀏覽器訪問該二維碼中的網(wǎng)站。(2)檢測到二維碼且解碼失敗當(dāng)拍攝區(qū)域檢測到了二維碼存在,但是由于角度偏差太大,光線不均勻,或者二維碼無損太嚴(yán)重,則都可能導(dǎo)致解碼失敗,本客戶端系統(tǒng)會提示用戶調(diào)整角度重新拍攝二維碼圖片。(3)未檢測到二維碼當(dāng)連續(xù)掃描圖像無任何定位點存在,或者存在定位點但是個數(shù)不為3個,或者有三個或多個定位點但是定位點位置關(guān)系與標(biāo)準(zhǔn)不相符合,則提示用戶調(diào)整位置,重新識別。運行控制手機用戶啟動本系統(tǒng)客戶端后,通過手機攝像頭對準(zhǔn)二維碼進(jìn)行識別解碼,提供了兩種方式進(jìn)行拍攝解碼:視頻攝像模式:該模式可以連續(xù)獲取圖片并進(jìn)行識別解碼。該模式優(yōu)點在于,可以連續(xù)拍攝識別,在較短時間內(nèi)可以實現(xiàn)多次掃描并識別解碼的過程;不足之處在于,攝像模式分辨率往往比拍攝模式要低,而分辨率會降低識別率影響識別效果。拍攝模式:該模式是拍攝靜止圖像,然后開始解碼識別。該模式的優(yōu)點在于:對于同一款固定機型而言,拍攝模式獲取的圖片分辨率一般要高于攝像模式所獲取的圖像分辨率,這樣,識別率必定會相應(yīng)提高;不足在于,拍攝模式獲取圖像的時間往往比較長,一般在一秒鐘甚至更長時間,才能拍攝一張圖片,直接導(dǎo)致識別解碼整體流程時間延長數(shù)倍至數(shù)十倍以上,會影響用戶體驗。所以,一般情況下,可以采用攝像模式進(jìn)行識別解碼,只有當(dāng)識別不了或者二維碼版本過高,印刷像素過小的情況下,才采用拍照模式進(jìn)行識別解碼。運行時間啟動本系統(tǒng)手機客戶端時間:沒有特殊時間要求,具體時間,與所安裝的手機硬件配置相關(guān)。配置越高啟動速度越快。識別解碼時間:在光線、水平角度合理的范圍內(nèi),一般在100毫秒左右可以完成一次識別過程。3.2.6系統(tǒng)出錯處理出錯信息本軟件為了用戶操作方便,用戶接口很簡單,而且大部分解碼識別功能都用算法實現(xiàn),用戶決定部分,只限制在攝像頭獲取到的數(shù)據(jù),所以出錯提示信息較少。補救措施如果客戶端運行過程中,圖像采集模塊需要消耗較多內(nèi)存,內(nèi)存大小根據(jù)拍攝模式不同而有差異,可能會出現(xiàn)內(nèi)存不夠的情況,此時可以提示用戶關(guān)掉其他程序,重新啟動機器,再嘗試識別解碼。3.3基于android的二維碼識別系統(tǒng)概要設(shè)計3.3.1本系統(tǒng)包含模塊圖3.2主要模塊及其關(guān)系系統(tǒng)包含兩個模塊,分別為二維碼的生成模塊,二維碼的解碼模塊,如圖3.2.圖3.2主要模塊及其關(guān)系其中二維碼的生成模塊單獨建立一個類實現(xiàn),解碼部分使用國際上流行的zxing二維碼開源代碼,由于這部分代碼很成熟,而且實現(xiàn)的功能繁多,有好多不太實用,我們基于這個源碼進(jìn)行簡化處理,最終實現(xiàn)本系統(tǒng)的主要功能。本系統(tǒng)主要有兩個模塊,分別是二維碼的生成模塊,這個模塊主要是二維碼的生成,以及生成的二維碼分享功能.二維碼的解碼模塊是由掃描部分和掃描歷史組成,掃描過的二維碼都會記錄在歷史中,如果是有關(guān)電話,網(wǎng)站的二維碼可以點擊撥打電話或者是進(jìn)入網(wǎng)頁瀏覽信息,下載等,掃描模塊借鑒開源代碼zxing,這是個很成熟的集成模塊,是當(dāng)今開發(fā)與二維碼相關(guān)app必備的一個模塊.3.3.2系統(tǒng)主要模塊本部分包含部分模塊的主要內(nèi)容。(一)用戶界面模塊(1)功能本模塊提供用戶操作的接口,主界面是拍攝窗口,顯示預(yù)覽到的二維碼圖像信息。(2)性能在光線正常的情況下,解碼成功時間不能太長,拍攝模式在1秒鐘以內(nèi);攝像模式在100毫秒以內(nèi)識別解碼完成,如果失敗,則繼續(xù)獲取下一幀圖片進(jìn)行識別解碼。(3)輸入項目輸入項是手機用戶通過用戶界面進(jìn)行的輸入,用戶界面模塊是通過菜單輸入選擇。(4)輸出項目主界面顯示二維碼圖像信息。(5)限制條件預(yù)覽和拍攝的速度,取決于手機硬件配置。(6)測試要點攝像頭對準(zhǔn)二維碼,能顯示預(yù)覽圖片。其余的相關(guān)內(nèi)容,可以詳細(xì)的參考論文的其他部分.(二)圖像采集模塊(1)功能圖像捕獲的主要功能是通過手機攝像頭,采集QR碼圖像數(shù)據(jù),將圖像數(shù)據(jù)轉(zhuǎn)換成計算機可以識別的二進(jìn)制數(shù)據(jù)格式,以便系統(tǒng)對圖像進(jìn)行分析,解碼QR碼的相關(guān)信息。圖像捕獲模塊是系統(tǒng)與外部進(jìn)行數(shù)據(jù)交互的接口模塊。圖像捕獲模塊可以以兩種方式進(jìn)行工作:手機攝像模式(動態(tài)采集)和拍照模式(靜態(tài)圖片捕獲)。手機攝像頭數(shù)據(jù)采集,主要是利用目前智能手機上帶有的高清晰拍照攝像頭來完成的。在本系統(tǒng)中采用的手機是Nokia7610,它的攝像頭具有100萬像素采集功能,但是由于其不支持近距離拍照功能以及不能進(jìn)行白平衡調(diào)整等缺陷,因此對系統(tǒng)的解碼功能帶來了一定的影響。一般的攝像頭都支持兩種功能的圖像捕獲:視頻采集模式和拍照模式,本機采用拍照模式。(2)性能時間:在光線正常的情況下,解碼成功時間不能太長,拍攝模式在1秒鐘以內(nèi);攝像模式在100毫秒以內(nèi)識別解碼完成,如果失敗,則繼續(xù)獲取下一幀圖片進(jìn)行識別解碼。(3)輸入項目拍照模式下支持4種分辨率,分別為1152*864、640*480、320*240和160*120。綜合考慮解碼速度和圖像處理量,本系統(tǒng)采用640*480模式進(jìn)行拍照。(4)輸出項目視頻采集模式和拍攝模式,輸出項都轉(zhuǎn)換成了位圖對象,便于后續(xù)模塊進(jìn)行處理。(5)限制條件由于手機硬件配置高低,直接決定了圖像采集的速度,所以可以根據(jù)本系統(tǒng)所安裝的真實手機配置,選擇適合的采集模式和分辨率。(6)測試要點分別通過攝像模式、拍照模式采集圖像,傳送給圖像處理模塊。首先要判斷圖像是否能采集成功;另外,要判斷圖像顏色是否有失真現(xiàn)象。(三)圖像處理模塊(1)功能圖像處理模塊的主要功能是獲得圖像捕獲模塊的圖像數(shù)據(jù),然后針對相應(yīng)的算法對圖像進(jìn)行預(yù)處理操作,包括將彩色圖像進(jìn)行二值化操作,將彩色圖像轉(zhuǎn)換為黑白圖像,以及完成對QR碼圖形的定位點識別,獲得圖形的版本信息,構(gòu)建采樣網(wǎng)絡(luò)對圖像進(jìn)行采樣,將圖形從以像素為單位轉(zhuǎn)換為以QR碼符號模塊為單位,方便核心解碼模塊的處理。該模塊將攝像頭采集的圖片進(jìn)行二值化處理,以便傳輸給核心解碼模塊進(jìn)行解碼。(2)性能時間:要求在攝像模式,二值化時間小于100毫秒;在拍攝模式,不能超過1秒鐘。精度:二值化后,不能使得二維碼邊界模糊,不能讓黑白方塊顏色區(qū)分度降低。(3)輸入項目圖像采集模塊所采集的二維碼圖像位圖數(shù)據(jù)。注意此圖像包括了二維碼和所在的背景圖像。(4)輸出項目二值化后的二維碼圖像數(shù)據(jù)。注意此圖像包括了二維碼和所在的背景圖像。(5)限制條件必須保證光線基本均勻,否則二值化后,可能導(dǎo)致部分圖片不清晰,最終降低識別率。3.3.3系統(tǒng)流程圖圖3.3程序流程圖圖3.3程序流程圖3.4導(dǎo)入項目系統(tǒng)的先期工作,首先是將zxing二維碼的源碼導(dǎo)入系統(tǒng),然后根據(jù)實際的使用情況加以個性化的定制. 導(dǎo)入系統(tǒng),首先打開Eclipse導(dǎo)入源碼中的Android項目,然后右擊項目選擇“Buildpath”"AddExternalArchives"把核心庫core.jar文件加入到項目中。此時編譯一下項目,會發(fā)現(xiàn)報錯,“Multiplesubstitutionsspecifiedinnon-positionalformat;didyoumeantoaddtheformatted="false"attribute?”之類的。打開raw下的Values發(fā)現(xiàn)錯誤是在一個<String>上。這里把“preferences_custom_product_search_summary”里的%s%f全部都改成%1$s%1$f(因為我們用不到多國語言,建議只保留默認(rèn)的Value,其他全部刪除)。 原因:由于新的SDK采用了新版本的aapt(Android項目編譯器),這個版本messages.</string>Inthisexample,theformatstringhastwoarguments:%1$sisastringand%2$disadecimalnumber.Youcanformatthestringwitharguementsfromyourapplication...“ 經(jīng)過以上步驟后項目應(yīng)該就可以運行了。但是ZXing的android項目東西太多了,有很多是我們不需要的,得新建另一個項目簡化它最終實現(xiàn)程序的開發(fā)。3.4.1簡化過程 接下來大致介紹一下簡化ZXing需要用到各個包、類的職責(zé)。 CaptureActivity這個是啟動Activity也就是掃描器(如果是第一安裝,它還會跳轉(zhuǎn)到幫助界面)。CaptureActivityHandler解碼處理類,負(fù)責(zé)調(diào)用另外的線程進(jìn)行解碼。<android:background="@android:color/transparent"/><TextViewandroid:layout_width="wrap_content"android:id="@+id/txtResult"android:layout_height="wrap_content"android:text="@string/hello"/></FrameLayout>可以看到在XML里面用到了ViewfinderView自定義view。所以新建一個View的包,然后把:ViewfinderView和ViewfinderResultPointCallback靠到里面(記得對應(yīng)修改XML里面的包)。打開CaptureActivity覆蓋onCreate方法:@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);inactivityTimer=newInactivityTimer(this);} 這里調(diào)用到的CameraManager類是控制攝像頭的包里的類。新建一個camera要是修改正包結(jié)構(gòu)。(整個簡化的流程都是如此:“根據(jù)錯誤提示,修改代碼”)。圖3.4CameraManager包文件圖3.4CameraManager包文件 在修改的過程中,有很多是關(guān)于R資源的問題,在此將Values里面的兩個xml資源文件拷入項目中:colos.xml和ids.xml。ctrl+b一下看看error是不是少了很多。<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-featureandroid:name="android.hardware.camera"/><uses-featureandroid:name="android.hardware.camera.autofocus"/><uses-permissionandroid:name="android.permission.VIBRATE"/><uses-permissionandroid:name="android.permission.FLASHLIGHT"/>tyHandler(this,decodeFormats,characterSet)用于進(jìn)行掃描解碼處理。3.4.2解碼原理 解碼是本系統(tǒng)的核心技術(shù),我們詳細(xì)的介紹一下本系統(tǒng)的解碼原理. 其中,上面的步驟主要都是用于對攝像頭的控制,而解碼的真正工作入口是在CaptureActivityHandler里面的。新建一個Decoding包把以下文件拷入包中:CaptureActivityHandler、DecodeFormatManager、InactivityTimer、Intents由于我們的包結(jié)構(gòu)和Zxing項目的有所不同所以需要注意一下類的可訪問性同樣開始ctrl+B編譯一下,然后開始修正錯誤。在CaptureActivityHandler里把handleMessage里的部分方法先注釋掉如:“decode_succeeded”分支,這是解碼成功時調(diào)用CaptureActivity展示解碼的結(jié)果。在DecodeThread類里,修改部分涉及Preference配置的代碼:功能代碼如下:importcom.google.zxing.BarcodeFormat;importcom.google.zxing.BinaryBitmap;importcom.google.zxing.ChecksumException;importcom.google.zxing.qrcode.decoder.Decoder;importcom.google.zxing.qrcode.detector.Detector;importjava.util.Hashtable;/***實現(xiàn)可以檢測和解碼圖像中的QR碼*/publicclassQRCodeReaderimplementsReader{}/***定位和解碼圖像中的QR碼*返回一個String,代表QR碼編碼的內(nèi)容*如果QR碼可以不被發(fā)現(xiàn)拋出NotFoundException*拋出FormatException,如果不能被解碼的QR代碼*拋出ChecksumException的糾錯失敗*/publicResultdecode(BinaryBitmapimage)throwsNotFoundException,ChecksumException,FormatException{returndecode(image,null);}publicResultdecode(BinaryBitmapimage,Hashtablehints)throwsNotFoundException,ChecksumException,FormatException{points=detectorResult.getPoints();}Resultresult=newResult(decoderResult.getText(),decoderResult.getRawBytes(),points,BarcodeFormat.QR_CODE);if(decoderResult.getByteSegments()!=null){result.putMetadata(ResultMetadataType.BYTE_SEGMENTS,decoderResult.getByteSegments());}}publicvoidreset(){//待定}/***檢測條碼一個“純粹”的形象-純黑白圖像*其中包含只有一個旋轉(zhuǎn)的,unskewed條碼,圖像與一些白色邊框*/publicstaticBitMatrixextractPureBits(BitMatriximage)throwsNotFoundException{iint[]leftTopBlack=image.getTopLeftOnBit();if(leftTopBlack==null){throwNotFoundException.getNotFoundInstance();}intx=leftTopBlack[0];}intmoduleSize=x-leftTopBlack[0];if(moduleSize==0){throwNotFoundException.getNotFoundInstance();}//發(fā)現(xiàn)第一排最右邊的黑色模塊結(jié)束introwEndOfSymbol=width-1;while(rowEndOfSymbol>x&&!image.get(rowEndOfSymbol,y)){rowEndOfSymbol--;}if(rowEndOfSymbol<=x){throwNotFoundException.getNotFoundInstance();}rowEndOfSymbol++;//確保條碼的寬度是多個模塊的大小if((rowEndOfSymbol-x)%moduleSize!=0){throwNotFoundException.getNotFoundInstance();}intdimension=1+((rowEndOfSymbol-x)/moduleSize);//推進(jìn)模塊寬度的一半,在模塊中的采樣中的“邊界”。//以防萬一的形象是一個小關(guān),這將有助于恢復(fù)。//需要備份至少有1。intbackOffAmount=moduleSize==1?1:moduleSize>>1;x-=backOffAmount;y-=backOffAmount;if((x+(dimension-1)*moduleSize)>=width||}returnbits;}}這里設(shè)置解碼的類型,我們現(xiàn)在默認(rèn)將所有類型都加入。錯誤類型基本上都是:包結(jié)構(gòu)、PreferencesActivity的配置、類可訪問性的問題。根據(jù)錯誤提示耐心把錯誤解決。之前在CaptureActivityHandler的messagehandler里注銷掉的Case分支,現(xiàn)在CaptureActivity里實現(xiàn)它。 publicvoidhandleDecode(Resultobj,Bitmapbarcode){ inactivityTimer.onActivity(); viewfinderView.drawResultBitmap(barcode); +obj.getText()); }3.5Android掃描系統(tǒng)概括 本系統(tǒng)是基于android平臺上使用Java語言實現(xiàn)的。掃描系統(tǒng)主要分為圖像采集模塊、圖像預(yù)處理模塊。圖像采集模塊主要利用攝像頭來完成條形碼圖像的采集;圖像預(yù)處理模塊主要對采集的條形碼圖像進(jìn)行灰度、二進(jìn)制、定位、矯正等處理;條形碼識別模塊主要根據(jù)QR碼標(biāo)準(zhǔn)來對條碼數(shù)據(jù)進(jìn)行提取,掃描完成功后,生成掃描歷史,存儲在本地當(dāng)中,如果是網(wǎng)址,電話信息可以直接點擊訪問或者是撥打電話。 掃描系統(tǒng)主要是在開源代碼zxing二維碼的基礎(chǔ)上編寫而成,同時參考了各大程序員論壇有關(guān)二維碼識別的博客改寫. 掃碼系統(tǒng)流程圖如圖3.5開始開始啟動攝像頭啟動攝像頭顯示圖像獲得一幀圖像顯示圖像獲得一幀圖像圖像二值化、定位圖像二值化、定位條碼定位成功N條碼定位成功Y顯示條碼數(shù)據(jù)提取條碼數(shù)據(jù)條碼旋正、矯正 顯示條碼數(shù)據(jù)提取條碼數(shù)據(jù)條碼旋正、矯正圖圖3.5條形碼掃描系統(tǒng)流程圖圖圖3.6android工程代碼 在開發(fā)中需要用到zxing開源組件。源碼可以到googlecode上將整個源碼下載下來。將android的工程導(dǎo)入到eclipse中,導(dǎo)入完成后,eclipse會顯示各種錯誤,這是缺少core文件夾里面的核心庫文件所致,在project中創(chuàng)建文件夾core,再將zxing源碼中得core文件夾下得代碼導(dǎo)入進(jìn)來,這樣就可以了。 如圖3.6:為整個android工程的代碼,其中主要關(guān)注的是android,camera,encode,result文件夾。 程序啟動的流程:加載mainactivity,在此類中創(chuàng)建CaptureActivityHandler對象,該對象啟動相機,實現(xiàn)自動聚焦,創(chuàng)建DecodeThread線程,DecodeThread創(chuàng)建Decodehandler,這個對象就獲取從相機得到的原始byte數(shù)據(jù),開始解碼的第一能是用戶直接啟動的。這樣就初始化了三個變量,一是source,便是啟動activity的源,一是decodeFormats,指出解碼的方式,是qr,還是其他的等等,最后一個是:charactreset,即是對于這些生成qr圖的字符的編碼方式。若沒有對core中得代碼修3.6Androidcamera的調(diào)用 在條碼掃描開發(fā)的過程中,最重要的就是camera的調(diào)用。下面就主要介紹下在開發(fā)過程中androidcamera的使用。打開zxing下的Barcodescanner,并會有如下的界面。先介紹這個界面:圖3.7Barcodescanner界面圖3.7Barcodescanner界面這個界面的定義主要在ViewfinderView.java這個類中,這個類繼承了View類,實canvas.drawRect(frame.left,frame.bottom-1,frame.right+1,frame.bottom+1,paint);最中間的一條紅色掃描線實現(xiàn)的代碼如下:onDraw()函數(shù)的最后一句是:postInvalidateDelayed(ANIMATION_DELAY,frame.left,frame.top,frame.right,frame.bottom);其中postInvalidateDelayed函數(shù)主要用來在非UI線程中刷新UI界面,每個ANIMATION_DELAY時間,刷新指定的范圍。所以會不停得調(diào)用onDraw函數(shù),并在界面上添加綠色的特征點。在camera聚焦獲取圖片后,再使用core中的庫進(jìn)行解析,會得出特征點的坐標(biāo),最后通過ViewfinderResultPointCallback類回調(diào)。ViewfinderView自定義了view,實現(xiàn)了一個簡潔的掃描界面。對于AndroidCamera的理解。下面對androidcamera開發(fā)做個簡單的調(diào)用。首先是使用camera需要用到的權(quán)限。<uses-permissionandroid:name="android.permission.CAMERA"/><uses-featureandroid:name="android.hardware.camera"/>如下是一個很簡單的camera示例,簡單到只能取景,即打開相機,將景象顯示在屏幕上。importjava.io.IOException;importandroid.app.Activity;importandroid.hardware.Camera;importandroid.os.Bundle;importandroid.view.SurfaceHolder;importandroid.view.SurfaceView;}publicvoidsurfaceCreated(SurfaceHolderarg0){//TODOAuto-generatedmethodstubcamera=Camera.open();Camera.Parametersparameters=camera.getParameters();parameters.setPreviewSize(480,320);//設(shè)置camera.setParameters(parameters);try{camera.setPreviewDisplay(surfaceHolder);}catch(IOExceptione){System.out.println(e.getMessage());}camera.startPreview();}}}其中的R.id.preview_view如下:<SurfaceViewandroid:id="@+id/preview_view"android:layout_width="fill_parent"android:layout_height="fill_parent"/> 其中activity實現(xiàn)了SurfaceHolder.Callback接口,并重寫了這個接口的三個方法。surfaceview獲取相機硬件捕捉到的數(shù)據(jù)并顯示出來,在上面的代碼中,先初始化了surfaceholder對象。并重寫了surfaceCreated函數(shù),在這個函數(shù)中,完成了對相機打開取景的基本操作。首先是Camera.open()獲取一個Camera對象,在初始化一些camera參數(shù),如圖像格式,圖像預(yù)覽大小,刷新率等等。在設(shè)置預(yù)覽顯示,最后startPreview,完成取景。android:screenOrientation="landscape"將landscape該為portrait,屏幕是豎著顯示了,但是取景后的內(nèi)容與顯示卻是橫豎這行代碼返回的總是null,即bitmap沒有成功生成。其中遇到了bug,原因是BitmapFactory.decodeByteArray只支持一定的格式,camara支持的previewformat格式為NV21,所以在獲得bitmap時,需要進(jìn)行轉(zhuǎn)換。通過YuvImage類來轉(zhuǎn)換成JPEG格式,之后就能再顯示出來了。解決照片的顯示問題后,還有一個問題便是自動聚焦。BarcodeScanner的代碼處理方式是:CameraManager.get().requestPreviewFrame(decodeThread.getHandler(),R.id.decode);//實現(xiàn)拍照CameraManager.get().requestAutoFocus(this,R.id.auto_focus);//實現(xiàn)聚焦首先實現(xiàn)拍照,再是實現(xiàn)聚焦,并且重載的聚焦回調(diào)函數(shù)是隔一段時間再次發(fā)出聚焦的請求,實現(xiàn)不斷的聚焦。代碼如下:publicvoidonAutoFocus(booleansuccess,Cameracamera){if(autoFocusHandler!=null){MessagemessageautoFocusHandler.obtainMessage(autoFocusMessage,success);autoFocusHandler=null;}else{Log.d(TAG,"Gotauto-focuscallback,butnohandlerforit");}}聚焦于拍照之前沒有先后的邏輯關(guān)系,聚焦為了拍照更清晰。這樣,關(guān)于camera取景聚焦拍照的簡單過程并如上了。還有一個關(guān)鍵的點幷是回調(diào)函數(shù)。例如一段簡單的button:privatefinalButton.OnClickListeneraddCardListener=newTextView.OnClickListener(){publicvoidonClick(Viewv){//在此實現(xiàn)button點擊后的操作}};如上的代碼實現(xiàn)了點擊監(jiān)聽,通過回調(diào)函數(shù),當(dāng)有點擊操作時,并執(zhí)行onClick函數(shù)。這就是一個簡單的回調(diào)函數(shù)的使用。3.7生成二維碼的功能實現(xiàn)本系統(tǒng)中二維碼的生成也是很重要的一部分,接下來我詳細(xì)的講解一下二維碼生成模塊是怎么實現(xiàn)的.其中,CreateCodeActivity類的主要功能就是對于二維碼的生成部分,這個部分是在原先zxing二維碼識別然后簡化之后進(jìn)行的,是整個項目的生成部分。生成的代碼主要也是這個部分:publicBitmapCreate2DCode(Stringstr)throwsWriterException{ //生成二維矩陣,編碼時指定大小,不要生成了圖片以后再進(jìn)行縮放,這樣會模糊導(dǎo)致識別失敗 BitMatrixmatrix=newMultiFormatWriter().encode(str,BarcodeFormat.QR_CODE,500,500); intwidth=matrix.getWidth(); intheight=matrix.getHeight(); //二維矩陣轉(zhuǎn)為一維像素數(shù)組,也就是一直橫著排了 int[]pixels=newint[width*height]; for(inty=0;y<height;y++){ for(intx=0;x<width;x++){ if(matrix.get(x,y)){ pixels[y*width+x]=0xff000000;} }} Bitmapbitmap=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); //通過像素數(shù)組生成bitmap,具體參考api bitmap.setPixels(pixels,0,width,0,0,width,height); returnbitmap; }}3.8其它處理功能的實現(xiàn) 本系統(tǒng)中不只是前面這么簡單,還有其他處理,如閃光燈,放大處理,最優(yōu)的預(yù)覽尺寸等等。這些不影響程序的開發(fā),知道camera的使用后,開始看看BarcodeScanner是如何高效的進(jìn)行識別處理的。在android包下,就有一個thread類:DecodeThread,兩個handler類:CaptureActivityHandler和DecodeHandler。在BarcodeScanner中,有著繁多的消息傳送,處理的消息的handler也有兩個。如何05-1202:41:12.594:I/System.out(655):CaptureActivityThemainthreadid=105-1202:41:14.605:I/System.out(655):CaptureActivityHandlerThehandlerthreadid=105-1202:41:12.946:I/System.out(655):DecodeThreadTheworkerthreadid=1305-1202:41:13.094:I/System.out(655):DecodeHandlerThehandlerthreadid=13由此可見,這兩個handler都分別屬于他們的thread。但在創(chuàng)建這兩個handler時,有很大的差別。CaptureActivityHandler的創(chuàng)建只是簡簡單單的new了,沒有其他輔助。這就是mainactivity在創(chuàng)建時,系統(tǒng)默認(rèn)為它創(chuàng)建一個looper,負(fù)責(zé)管理該線程的消息循環(huán),取送消息等,不需要額外指定。但對于自己創(chuàng)建的Thread,系統(tǒng)默認(rèn)是沒有為其創(chuàng)建looper的,需要自己為它創(chuàng)建消息循環(huán)。先看下DecodeThread的代碼:去掉了跟理解線程不相關(guān)的代碼finalclassDecodeThreadextendsThread{publicstaticStringTAG=DecodeThread.class.getSimpleName();privatefinalCaptureActivityactivity;privateHandlerhandler;privatefinalCountDownLatchhandlerInitLatch;//到計數(shù)的鎖DecodeThread(CaptureActivityactivity,Vector<BarcodeFormat>decodeFormats,StringcharacterSet,ResultPointCallbackresultPointCallback){this.activity=activity;handlerInitLatch=newCountDownLatch(1);//從1開始到計數(shù)}HhandlerInitLatch.countDown();//啟動到計數(shù),countdown-1變成0;System.out.println(TAG+"Theworkerthreadid="+Thread.currentThread().getId());//判斷線程IDLooper.loop();}前面定義了一個CountDownLatch類型變量,該變量為一個倒計數(shù)用的鎖。用法挺簡單,如代碼中,先newCountDownLatch(1),計數(shù)值為1,handlerInitLatch.countDown(),開始倒數(shù)。handlerInitLatch.await()若計數(shù)值沒有變?yōu)?,則一直阻塞。直到計數(shù)值為0后,才returnhandler,因此在調(diào)用getHandler時不會返回null的handler。在創(chuàng)建DecodeThread線程的handler時,首先在線程中調(diào)用Looper.prepare()來創(chuàng)建消息隊列,再創(chuàng)建附于該線程的handler對象,最后調(diào)用Looper.loop()進(jìn)入消息循環(huán),這個這個loop()循環(huán)不會立馬返回,需要自己主動調(diào)用Looper.myLooper().quit()才會返回。這就是自己創(chuàng)建一個工作線程,為其分配一個消息隊列,消息循環(huán)的簡單迅速辦法。 前面部分講解了camera的自動聚焦,只是隔斷時間定期的不停向CaptureActivityHandler發(fā)送自動聚焦請求,這就是一個消息傳送:Messagemessage=autoFocusHandler.obtainMessage(autoFocusMessage,success);autoFocusHandler.sendMessageDelayed(message,AUTOFOCUS_INTERVAL_MS);這樣創(chuàng)建了消息,隔斷時間發(fā)送。3.6BarcodeScanner在掃描中出現(xiàn)的問題解決 在使用BarcodeScanner掃描GB2312編碼的qr碼,掃描結(jié)果會出現(xiàn)亂碼,無法正常顯示。這個問題,原因在DecodedBitStreamParser類里面完成了對原始的bytes進(jìn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論