二維碼生成與識(shí)別原理修訂版_第1頁(yè)
二維碼生成與識(shí)別原理修訂版_第2頁(yè)
二維碼生成與識(shí)別原理修訂版_第3頁(yè)
二維碼生成與識(shí)別原理修訂版_第4頁(yè)
二維碼生成與識(shí)別原理修訂版_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、QR二維碼的生成與識(shí)別原理一、簡(jiǎn)介二維碼(2-dimensionalbarcode),是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號(hào)信息的。二維碼的種類包括:QRCode,DataMatrix,MaxiCode,Aztec,Vericode,PDF417,Ultracode,Code49,Code16K等。其中QRCode是被廣泛使用的二維碼,QR全稱QuickResponse,與其他編碼方式相比,QR二維碼具有存儲(chǔ)容量大、編碼速度快的特點(diǎn),并且它也能表示更多的數(shù)據(jù)類型:比如:字符,數(shù)字,日文,中文等等。隨著近幾年智能手機(jī)的迅猛發(fā)展,QR二維碼得到了廣泛的

2、應(yīng)用。關(guān)于QR二維碼的標(biāo)準(zhǔn),可參見(jiàn)標(biāo)準(zhǔn)文檔(QRCodeSpec):二、應(yīng)用現(xiàn)狀隨著智能機(jī)的普及和手機(jī)攝像頭成像能力的提升,為了提高向機(jī)器內(nèi)輸入信息的速度,QR二維碼得到迅猛發(fā)展,在許多行業(yè)中得到應(yīng)用。在一維碼時(shí)代,“掃碼”主要應(yīng)用在超市或圖書館等場(chǎng)所,以獲取商品價(jià)格或圖書分類等有限的特定信息。二維碼可以存儲(chǔ)大容量數(shù)據(jù),給人們的生活帶來(lái)巨大方便。從開(kāi)始的掃描二維碼提取文字或網(wǎng)址,到后來(lái)“掃一掃”添加好友、關(guān)注個(gè)人或公司微信或微博,再到掃碼支付,二維碼的應(yīng)用已經(jīng)非常普遍。三、基礎(chǔ)知識(shí)QR碼可分為不同的尺寸,或者叫版本Version。Version1是21x21的矩陣,Version2是25x25

3、的矩陣,Version3是29的尺寸,每增加一個(gè)version,就會(huì)增加4的尺寸,公式是:(V-1)*4+21(V是版本號(hào))最高Version40,(40-1)*4+21=177,所以最高是177x177的正方形。樣例如下:QuietZoneP«iLoriDe:ectioiiPfTTrFSeparators加rPoski州FunctionDeiecijotii/Pn:"ernsTimii膽PatlerinS,iriribnlA:gnnienEPanernsFnrrorInfanpatirKiX'rrs.icn為日山卜前:口口ElKudiliRegion除了上述的那些

4、地方,剩下的地方存放321tlendErrorCEMTECtion.Codewords定位圖案PositionDetectionPattern是定位圖案,用于標(biāo)記二維碼的矩形大小。這三個(gè)定位圖案有白邊叫SeparatorsforPostionDetectionPatterns。之所以三個(gè)而不是四個(gè)意思就是三個(gè)就可以標(biāo)識(shí)一個(gè)矩形了。TimingPatterns也是用于定位的。原因是二維碼有40種尺寸,尺寸過(guò)大了后需要有根標(biāo)準(zhǔn)線,不然掃描的時(shí)候可能會(huì)掃歪了。AlignmentPatterns只有Version2以上(包括Version2)的二維碼需要這個(gè)東東,同樣是為了定位用的。功能性數(shù)據(jù)Form

5、atInformation存在于所有的尺寸中,用于存放一些格式化數(shù)據(jù)的。VersionInformation在Version7以上,需要預(yù)留兩塊3x6的區(qū)域存放一些版本信息。數(shù)據(jù)碼和糾錯(cuò)碼DataCode數(shù)據(jù)碼和ErrorCorrectionCode糾錯(cuò)碼。四、數(shù)據(jù)編碼QR碼支持如下的編碼:Numericmode:數(shù)字編碼,從0至U9。如果需要編碼的數(shù)字的個(gè)數(shù)不是3的倍數(shù),那么,最后剩下的1或2位數(shù)會(huì)被轉(zhuǎn)成4或7bits,則其它的每3位數(shù)字會(huì)被編成10,12,14bits,編成多長(zhǎng)還要看二維碼的尺寸。Alphanumericmode:字符編碼,包括0-9,大寫的A到Z(沒(méi)有小寫),以及符號(hào)$%

6、*+-./:包括空格。這些字符會(huì)映射成一個(gè)字符索引表。如下所示:(其中的SP是空格,Char是字符,Value是其索引值)編碼的過(guò)程是把字符兩兩分組,然后轉(zhuǎn)成下表的45進(jìn)制,然后車t成11bits的二進(jìn)制,如果最后有一個(gè)落單的,那就轉(zhuǎn)成6bits的二進(jìn)制。而編碼模式和字符的個(gè)數(shù)需要根據(jù)不同的Version尺寸編成9,11或13個(gè)二進(jìn)制(如下表中Table3)Char,Value。問(wèn).:ValueValueChar.ValueC?iar;ValueChar.ValueChsr;ValjeCtiar.:VsIle0066c12r:180;24u30SP;36;42117:7D13j:19p:25V

7、31S:371t13229:8E14K;20Q26W32%:38I:44339:9F15L!2,R!27X33,:3944A;10G16Mj22S:28¥34+:4055B:11HN:23T:29z35i41IBytemode:字節(jié)編碼,可以是0-255的ISO-8859-1字符。有些二維碼的掃描器可以自動(dòng)檢測(cè)是否是UTF-8的編碼。Kanjimode:日文編碼,也是雙字節(jié)編碼。同樣,也可以用于中文編碼。ExtendedChannelInterpretation(ECI)mode:主要用于特殊的字符集。并不是所有的掃描器都支持這種編碼。StructuredAppendmode:用于混

8、合編碼,也就是說(shuō),這個(gè)二維碼中包含了多種編碼格式。FNC1mode:這種編碼方式主要是給一些特殊的工業(yè)或行業(yè)用的。比如GS1條形碼之類的。這里我們主要介紹最常用的數(shù)字編碼和字符編碼。下面兩張表中,Table2是各個(gè)編碼格式的“編號(hào)”(注:中文是1101),編號(hào)要寫在FormatInformation中。Table3表示了不同版本(尺寸)的二維碼,對(duì)于數(shù)字、字符、字節(jié)和Kanji模式下,對(duì)于單個(gè)編碼的2進(jìn)制的位數(shù)。(編碼規(guī)范表可參見(jiàn)二維碼規(guī)格說(shuō)明書)Table2ModemdicatoreModeIndicatorECI0111Numenc0001Alphanumeric«10BbitB

9、yte0100KanjiwooStructuredAppendPoonFKC10101(Firstposition)1001(Secondposition)TerminatorEndofMessage)FooooTable3NumberofbitsinCharacterCountIndicatorVerstonNumericModeAlphanurriericNode8-bitByteModeKanjiMode1to9109arb10to2612111027to4。14131612舉例說(shuō)明:示例一:數(shù)字編碼例如,在Version1的尺寸下,糾錯(cuò)級(jí)別為H的情況下,編碼:01234567的編碼方式

10、如下:1 .把上述數(shù)字分成三組:012345672 .把他們轉(zhuǎn)成二進(jìn)制:012轉(zhuǎn)成0000001100;345轉(zhuǎn)成0101011001;67轉(zhuǎn)成1000011O3 .把這三個(gè)二進(jìn)制串起來(lái):0000001100010101100110000114 .把數(shù)字的個(gè)數(shù)轉(zhuǎn)成二進(jìn)制(version1-H是10bits):8個(gè)數(shù)字的二進(jìn)制是00000010005 .把數(shù)字編碼的標(biāo)志0001和第4步的編碼加到前面:00010000001000000000110001010110011000011示例二:字符編碼同樣,在Version1的尺寸下,糾錯(cuò)級(jí)別為H的情況下,編碼:AC-42的編碼方式如下:1 .從字符

11、索引表中找到AC-42這五個(gè)字條的索引(10,12,41,4,2)2 .兩兩分組:(10,12)(41,4)(2)3 .把每一組轉(zhuǎn)成11bits的二進(jìn)制:(10,(12) 10*45+12等于462轉(zhuǎn)成00111001110(41,(4) 41*45+4等于1849轉(zhuǎn)成11100111001(2)等于2轉(zhuǎn)成0000104 .把這些二進(jìn)制連接起來(lái):0011100111011100111001000010;5 .把字符的個(gè)數(shù)轉(zhuǎn)成二進(jìn)制(Version1-H為9bits):5個(gè)字符,5轉(zhuǎn)成000000101;6 .在頭上加上編碼標(biāo)識(shí)0010和第5步的個(gè)數(shù)編碼:00100000001010011100

12、111011100111001000010;五、結(jié)束符和補(bǔ)齊符假如我們有個(gè)HELLOWORLD勺字符串要編碼,根據(jù)上面的示例二,我們可以得到卜面的編碼編碼字符數(shù)HELLOWORLD勺編碼00100000010110110000101101111000110100010111001011011100010011010100001101還要加上結(jié)束符:編碼字符數(shù)HELLOWORLD勺編碼結(jié)束001000000101101100001011011110001101000101110010110111000100110101000011010000按8bits重排如果所有的編碼加起來(lái)不是8個(gè)倍數(shù)我們還

13、要在后面加上足夠的0,比如上面一共有78個(gè)bits,所以還要加上2個(gè)0,然后按8個(gè)bits分好組:00100000010110110000101101111000110100010111001011011100010011010100001101000000補(bǔ)齊碼(PaddingByteS最后,如果還沒(méi)有達(dá)到最大的bits數(shù)的限制,還要加一些補(bǔ)齊碼(PaddingBytes),PaddingBytes就是重復(fù)下面的兩個(gè)bytes:1110110000010001(這兩個(gè)二進(jìn)制轉(zhuǎn)成十進(jìn)制是236和17,關(guān)于每一個(gè)Version的每一種糾錯(cuò)級(jí)別的最大Bits限制,可以參看QRCodeSpeC假設(shè)我

14、們需要編碼的是Version1的Q糾錯(cuò)級(jí),那么,其最大需要104個(gè)bits,而我們上面只有80個(gè)bits,所以,還需要補(bǔ)24個(gè)bits,也就是需要3個(gè)PaddingBytes,我們就添加三個(gè),于是得到下面的編碼:00100000010110110000101101111000110100010111001011011100010011010100001101000000111011000001000111101100上面的編碼就是數(shù)據(jù)碼了,叫DataCodewords,每一個(gè)8bits叫一個(gè)codeword,我們還要對(duì)這些數(shù)據(jù)碼加上糾錯(cuò)信息。六、糾錯(cuò)碼上面我們說(shuō)到了一些糾錯(cuò)級(jí)別,ErrorCo

15、rrectionCodeLevel,二維碼中有四種級(jí)別的糾錯(cuò),這就是為什么二維碼有殘缺還能掃出來(lái),也就是為什么有人在二維碼的中心位置加入圖標(biāo)。錯(cuò)誤修正容量L水平7%的字碼可被修正M水平15%的字碼可被修正Q水平25%的字碼可被修正H水平30%的字碼可被修正那么,QR是怎么對(duì)數(shù)據(jù)碼加上糾錯(cuò)碼的?首先需要對(duì)數(shù)據(jù)碼進(jìn)行分組,也就是分成不同的Block,然后對(duì)各個(gè)Block進(jìn)行糾錯(cuò)編碼,對(duì)于如何分組,可以查看QRCodeSpec的定義表。這里注意最后兩列:NumberofErrorCodeCorrectionBlocks:需要分多少個(gè)塊。ErrorCorrectionCodePerBlocks:每一個(gè)

16、塊中的code個(gè)數(shù),所謂的code的個(gè)數(shù),也就是有多少個(gè)8bits的字節(jié)。5134L2&1(134J08J3)PM4&2(67,43,12)Q7222(33.15,9)(34,1610)H8822儆11,11)(34J2J1)6172L醬2(MiMWM64A(43.27,8)Q964(4319,12)H1124(43,15,14)316%。1c=totalnumberofcodewordsk=numberofdatacodewordsrnumbercferrorcorrectioncapacitybErrorcorrecboncapacityislessthanhzlfth。n

17、umberoferrorcorrectioncodewordstoreducetfieprobabilityofmisdecodes舉例說(shuō)明:上述的Version5+Q糾錯(cuò)級(jí):需要4個(gè)Blocks(2個(gè)Blocks為一組,共兩組),第一組的兩個(gè)Blocks中各15個(gè)bits數(shù)據(jù)+各9個(gè)bits的糾錯(cuò)碼(注:表中的codewords就是一個(gè)8bits的byte)(再注:最后一例中的(c,k,r)的公式為:c=k+2*r,因?yàn)楹竽_注解釋了:糾錯(cuò)碼的容量小于糾錯(cuò)碼的一半)下圖給一個(gè)5-Q的示例(因?yàn)槎M(jìn)制寫起來(lái)會(huì)讓表格太大,這里使用十進(jìn)制表示,可以看到每一塊的糾錯(cuò)碼有18個(gè)codewords,也就是

18、18個(gè)8bits的二進(jìn)制數(shù))組塊數(shù)據(jù)對(duì)每個(gè)塊的糾錯(cuò)碼1167857013487388519421319911451152472412232291195061861033824815411715411186161111392246246667118134242787204966020218212415720038862219819914661342712920917163163120133211822302471195071181481161772127613375242238134873882613415150776195230189101082401921412702471188619461

19、51502351595173241475933106401623617236172361723625517282213132178236(注:二維碼的糾錯(cuò)碼主要是通過(guò)Reed-Solomonerrorcorrection(里德-所羅門糾錯(cuò)算法)來(lái)實(shí)現(xiàn)的)七、最終編碼上述步驟完成之后,還要把數(shù)據(jù)碼和糾錯(cuò)碼的各個(gè)codewords交替放在一起。交替規(guī)則如下:對(duì)于數(shù)據(jù)碼:把每個(gè)塊的第一個(gè)codewords先拿出來(lái)按順度排列好,然后再取第一塊的第二個(gè),如此類推。如上述示例中的DataCodewords如下:塊167857013487388519411950618610338塊2246246667118

20、13424273886221981991466塊31822302471195071181348738826134151507塊4702471188619461515016236172361723617236我們先取第一列的:67,246,182,70然后再取第二列的:67,246,182,70,85,246,230,247如此類推:67,246,182,70,85,246,230,247,38,6,50,17,7,236對(duì)于糾錯(cuò)碼,也是一樣:塊121319911451152472412232292481541171541118616111139塊287204966020218212415720

21、01342712920917163163120133塊314811617721276)133752422387619523018910108240192141塊423515951732414759331064025517282213132178236和數(shù)據(jù)碼取的一樣,得到:213,87,148,235,199,204,116,159,39,133,141,236然后,再把這兩組放在一起(糾錯(cuò)碼放在數(shù)據(jù)碼之后)得到:67,246,182,70,85,246,230,247,70,66,247,118,134,7,119,86,87,118,50,194,38,134,7,6,85,242,118

22、,151,194,7,134,50,119,38,87,16,50,86,38,236,6,22,82,17,18,198,6,236,6,199,134,17,103,146,151,236,38,6,50,17,7,236,213,87,148,235,199,204,116,159,11,96,177,5,45,60,212,173,115,202,76,24,247,182,133,147,241,124,75,59,223,157,242,33,229,200,238,106,248,134,76,40,154,27,195,255,117,129,230,172,154,209,1

23、89,82,111,17,10,2,86,163,108,131,161,163,240,32,111,120,192,178,39,133,141,236這就是數(shù)據(jù)區(qū)。RemainderBits最后再加上ReminderBits,對(duì)于某些Version的QR,上面的還不夠長(zhǎng)度,還要加上RemainderBits,比如:上述的5Q版的二維碼,還要加上7個(gè)bits,RemainderBits加零就好了。關(guān)于哪些Version需要多少個(gè)Remainderbit,可以參看QRCodeSpec的第15頁(yè)的Table-1的定義表。八、畫二維碼圖PositionDetectionPattern首先,先把P

24、ositionDetection圖案畫在三個(gè)角上。(無(wú)論Version如何,這個(gè)圖案的尺寸不變)TT|AlignmentPattern然后,再把Alignment圖案畫上(無(wú)論Version如何,這個(gè)圖案的尺寸就是這么大)I5-Ih-3t國(guó)關(guān)于Alignment的位置,可以查看QRCodeSpec的第81頁(yè)的Table-E.1的定義表(下表是不完全表格)Tab帕ErlRow何。iumncoardlnateofcenUrmoduleofAlignmentPatternsVersionNumberofAlignmentPatternsRaw/Columncoordmatesofcenternnod

25、ule10-21618316224162651630e163476622388662442g66264610662B50卜圖是根據(jù)上述表格中的Version8的一個(gè)例子(6,24,42)Version8QRCode0.0旬.06-024畝0-04262442TimingPattern接下來(lái)是TimingPattern的線ormatInformation再接下來(lái)是FormationInformation,下圖中的藍(lán)色部分。FormatInformation是一個(gè)15個(gè)bits的信息,每一個(gè)bit的位置如下圖所示:(注意圖中的DarkModule,是永遠(yuǎn)出現(xiàn)的)這15個(gè)bits中包括:5個(gè)數(shù)據(jù)bi

26、ts:其中,2個(gè)bits用于表示使用什么樣的ErrorCorrectionLevel,3個(gè)bits表示使用什么樣的Mask10個(gè)糾錯(cuò)bits。主要通過(guò)BCHCode來(lái)計(jì)算然后15個(gè)bits還要與101010000010010做XOR操作。這樣就保證不會(huì)因?yàn)槲覀冞x用了00的糾錯(cuò)級(jí)別和000的Mask,從而造成全部為白色,這會(huì)增加我們的掃描器的圖像識(shí)別的困難。下面是一個(gè)示例:001010010100110111000O1G10011011100101010000010010100090011001110AssumeEroCorreGlionLevelM:andMaskPatternRfer-enc

27、e:Data:BCHbite:Unmaskedbitsequence;Mas-kpatternoperabon:Formatliformationmpdulepattern:關(guān)于ErrorCorrectionLevel如下表所示:ErrorCorrectionLevelBinaryindicatorL01M00Q11PH10關(guān)于Mask圖案如后面的Table23所示。VersionInformation再接下來(lái)是VersionInformation(版本7以后需要這個(gè)編碼),下圖中的藍(lán)色部分。VersionInformation一共是18個(gè)bits,其中包括6個(gè)bits的版本號(hào)以及12個(gè)bit

28、s的糾錯(cuò)碼,下面是一個(gè)示例:Versionnumber:Data;BCHbits:FormatInformationmodulepattern而其填充位置如下:70001111100100101000001111100100101001215162151對(duì)1111411?02n4567K91(11112產(chǎn)14151617Vkirsiuninlower加MVursionInlbmiHliuninupperrimhl數(shù)據(jù)和數(shù)據(jù)糾錯(cuò)碼然后是填接我們的最終編碼,最終編碼的填充方式如下:從左下角開(kāi)始沿著紅線填我們的各個(gè)bits,1是黑色,0是白色。如果遇到了上面的非數(shù)據(jù)區(qū),則繞開(kāi)或跳過(guò)。QRv3orde

29、r,frombottomright掩碼圖案這樣下來(lái),圖基本填好了,但是,也許那些點(diǎn)并不均衡,如果出現(xiàn)大面積的空白或黑塊,掃描識(shí)別會(huì)變得困難。所以,最后還要做Masking操作。QR的Spec中描述到,QR有8個(gè)Mask你可以使用,其中,各個(gè)mask的公式在各個(gè)圖下面。所謂mask,就是和上面生成的圖做XOR操作。Mask只會(huì)和數(shù)據(jù)區(qū)進(jìn)行XOR,不會(huì)影響功能區(qū)。(注:選擇一個(gè)合適的Mask也是有算法的)-X向問(wèn)皚wyzr2為施劃3*x/%3%2+(X*y)%25t2其Mask的標(biāo)識(shí)碼如下所示:(其中的i,j分別對(duì)應(yīng)于上圖的x,y)Table23Maskpatterngenerationcondi

30、tionsMaskPatternReferenceConditionDOO"十力mod2=0001irthod2=0QW/mod=0011(/+刃mod3=0100(fdiv2)+(jdiv3)mod2=01C1Hj)mod2+(ii)mod3-0110“"Imod2*(/j)mod3)mod2=0111(r力mod3+mod2mod2=0卜面是Mask后的一些樣子,可以看到被某些MaskXOR了的數(shù)據(jù)變得比較零散了。小匕或也1加mkcmbnIMask過(guò)后的二維碼就成最終的圖了。九、識(shí)別:既然二維碼的生成搞懂了,那么識(shí)別就會(huì)變得簡(jiǎn)單,基本上就是生成的逆過(guò)程。對(duì)于手機(jī)端掃描Q

31、R二維碼的識(shí)別而言,重點(diǎn)在于攝像頭獲取數(shù)據(jù)后,對(duì)數(shù)據(jù)的最初處理,這里以Android手機(jī)識(shí)別QR二維碼為例、以源碼為主要依據(jù)進(jìn)行簡(jiǎn)要說(shuō)明。1、獲取攝像頭原始數(shù)據(jù)。首先Android提供了PreviewCallback接口,只要在Activity里實(shí)現(xiàn)PreviewCallback接口后,就會(huì)自動(dòng)重載這個(gè)函數(shù):publicvoidonPreviewFrame(bytedata,Cameracamera)clci&sPreviewCallbackiinplenient?CarreraPreviewCallbackOverridepublicvoidanPreviewFrfime(byteC

32、ameraPointcarerResolution=configrianagcr.gettameraResolutionO;Handlertie?reviewHandler=previewHandler;if(thePreviewHandlcr!=null)Messdfieinessdge-IhePreviewHndlerotjtdinHesbdgefpreviewMessdfie,carwrdKesclutiun.xj恤總自晚solution*yJdata)rpssagp.sendTolarget(J;previewHandler=null;else(Log.dfMG,"Gotpr

33、eviewcallbckjbutnohandlerforit1');)這個(gè)函數(shù)里的data就是實(shí)時(shí)預(yù)覽幀視頻,也就是攝像頭返回的最原始的數(shù)據(jù)。這樣,就解決了如何獲取攝像頭數(shù)據(jù)的問(wèn)題。一旦程序調(diào)用PreviewCallback接口,就會(huì)自動(dòng)調(diào)用onPreviewFrame這個(gè)函數(shù)。調(diào)用PreviewCallback的方法有三種。分別是:setPreviewCallback,setOneShotPreviewCallback,setPreviewCallbackWithBuffer,程序中使用第二種方式,示例如下:PreviewCallbackpreviewCa1Iback=newPrev

34、iewCallbackfconfi£Mdnder);Cameracamera=Carriera»(2pen()jcdmeia.setOneSliQtPr'eviewCdllbdck(previekCdllbdck);至于何時(shí)觸發(fā)onPreviewFrame()這個(gè)函數(shù)來(lái)獲得攝像頭數(shù)據(jù),一般選擇按一個(gè)按鍵觸發(fā)一次或者每隔一段時(shí)間觸發(fā)一次,無(wú)論如何,只要在該觸發(fā)的地方寫上Camera.setOneShotPreviewCallback(RectPhoto.this);便會(huì)自動(dòng)觸發(fā)一次。這樣我們就可以得到手機(jī)攝像頭實(shí)時(shí)預(yù)覽幀視頻數(shù)據(jù)data。2、解碼數(shù)據(jù)獲取該數(shù)據(jù)后,要對(duì)

35、二維碼進(jìn)行解碼,我們?cè)贒ecodeHandler類中定義了解碼方法:privatevoiddecode(bytedata,intwidth,intheight)我們重點(diǎn)對(duì)該方法進(jìn)行分析:“privatevoiddecbyteintwidth,intheight)longstart-SystenTrurntTiweHi£();/ResultrawResult=null;byt叩rotatedOata=newbytefdata.length;for(inty=6;y<height;y+)<8Afor(intj(-0;x<width;m+)rotatetKatamheig

36、ht<height-y-1-datafx+y*widthj慳87Intimp=width;fl4width-height;.5height=tmp;data=rotatedData;87/取得指定范匡的幀的軟振PlanjrYUVLumiritinccSourcesour1q-activitytgetCamcrtiMiinagerO*89buildiLufflinanc&Soijrcefdara>width,height);90,/取得荻度醫(yī)BiridryBitmapLiIm.j?=ne«Binar'yBitmapfnewHybridBinarizer(so

37、urce);92try(VJ/和片方面金漆將科匹的物飄特框需bitmap,磐片聲bitm己p首行薛叫14/(狂注生PHWResult就亞解百除了百三的內(nèi)客)ra:esult二multiFormdtRejder.decodeWithState(bitmap);catch(drExceptionre)197/contirmet58)finallymultiForiMtfi#jder,reset(j口加Ifli1+(r(»wRfltult!null)除辛£8=H«£fagfrtobtcnn(activitytg»tHandl»r()tMfs

38、,dfcade_siiccftifdtrwRful?)iBundJebundle=n«iuHund*);liin-.putPjk-rlabl(09codeThrejdx£l»ffC0D£scurcpLrend&rCro3pecfcireyscdleBitniap();:.rne&GAg£TSQtDjtd(bundll);1.messageTsendTcTargt();elseMessageiKssjge-Message.obtain(activity.tlIandler()fMessageIDs.decrtfs_fditetf)

39、jfillrwjiiJgetsendToTdfeLOflli)IB!第78-82行代碼,最初的數(shù)據(jù)應(yīng)該被看成為一個(gè)矩陣數(shù)據(jù),只是把它存放在一維數(shù)組byte中,這里是將其轉(zhuǎn)換成轉(zhuǎn)置矩陣,即aij與aji交換,因此在83-85行代碼中,對(duì)寬高也進(jìn)行了調(diào)換;第88-95行代碼,這是解析數(shù)據(jù)最為關(guān)鍵的代碼,88行我們定義了PlanarYUVLuminanceSource類的對(duì)象,關(guān)于YUV數(shù)據(jù)格式以及該類的介紹參見(jiàn)后面的附錄-o最后,需要將PlanarYUVLuminanceSource類處理的數(shù)據(jù)轉(zhuǎn)化成Bitmap對(duì)象。代碼的第91行即為此操作。至此,我們得到了二維碼圖片的Bitmap對(duì)象,就可以按

40、照二維碼生成的逆過(guò)程運(yùn)算對(duì)數(shù)據(jù)進(jìn)行解析。解碼示例:例如,程序在進(jìn)行解碼分析時(shí),首先要根據(jù)版本信息和糾錯(cuò)級(jí)別進(jìn)行判斷,即讀取VersionInformation和DataandErrorCorrectionCodewords處數(shù)據(jù),若取得版本為1,接錯(cuò)級(jí)別為H,按照QR碼的規(guī)范,查下表:VersionErrorcorrectionlevelNumberofdatacodewordsNumberofdatabits口atacapacityNumericAlphanumericByteKanjiErrorM1Detection3205,onlyM2LM54403210865-11&42314

41、9&MJM968151174L1612813521159M4Q10802113951L1915241251710M16123342014aQ131042716117H972171074可知應(yīng)讀取數(shù)據(jù)區(qū)連續(xù)的72個(gè)bits作沏個(gè)整體,比如我們讀到如下數(shù)據(jù):001000000010100111001110111001110010000100000000111011000001000111101100對(duì)于該數(shù)據(jù),按照QR碼的規(guī)范,前四位為編碼格式編號(hào),即0010對(duì)應(yīng)的是字符編號(hào),說(shuō)明后面的內(nèi)容為字符;根據(jù)QR碼編碼規(guī)范,版本為1、糾錯(cuò)級(jí)別為H的編碼,數(shù)字個(gè)數(shù)占九位,

42、即取編碼格式編號(hào)的后九位:000000101,轉(zhuǎn)換成十進(jìn)制為5,即得知該數(shù)據(jù)包含5個(gè)字符。再次按照QR碼編碼規(guī)范,字符編碼過(guò)程中,每一組數(shù)據(jù)為11位,并且如果最后有一個(gè)落單的,那就轉(zhuǎn)成6bits的二進(jìn)制。那么根據(jù)有5個(gè)字符,我們?nèi)‰S后的28位數(shù)據(jù),即為真正的數(shù)據(jù)編碼:0011100111011100111001000010將上述三組數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制即為(462,1849,2),根據(jù)字符編碼的編碼規(guī)范,編碼的過(guò)程是把字符兩兩分組,然后轉(zhuǎn)成下表的45進(jìn)制。那么,分別將462、1849、2轉(zhuǎn)化為45進(jìn)制轉(zhuǎn)換之前的數(shù)據(jù),得到(10,12)(41,4)(2),查詢字符編碼表,得出對(duì)應(yīng)的字符分別為:A,C

43、,-,4,2,即原始數(shù)據(jù)為AC-42,解碼結(jié)束。3、將獲取數(shù)據(jù)與解碼關(guān)聯(lián)在實(shí)際的應(yīng)用中,因?yàn)閿?shù)據(jù)的識(shí)別解析過(guò)程比較慢,并且二維碼識(shí)別、解碼一次不一定能成功,那么要如何科學(xué)的把上述兩步(獲取數(shù)據(jù)與解碼)關(guān)聯(lián)在一起呢?首先,由于數(shù)據(jù)識(shí)別和解析是一個(gè)耗時(shí)操作,我們要利用線程機(jī)制,在一個(gè)線程中操作,這里我們定義了一個(gè)繼承Thread的DecodeThread類,該線程與DecodeHandler配合,完成解析數(shù)據(jù)的功能,由于一次識(shí)別不一定成功,那么就要在每次識(shí)別失敗之后,重新調(diào)用第一小節(jié)中提到的方法,重新獲取攝像頭數(shù)據(jù)進(jìn)行再一次的解析。如此反復(fù)直到成功。那么程序又是如何判定失敗的呢?在上面貼出的第95行代碼處,將最終的解析結(jié)果放置在rawResult變量中,后面對(duì)該變量就行判斷,若不為空,則表示解析成功,若為空表示解析失敗,程序會(huì)向主線程發(fā)送解析失敗的消息,來(lái)進(jìn)行再一次的解析過(guò)程。附錄一:YUV數(shù)據(jù)格式簡(jiǎn)介以及獲得像素?cái)?shù)據(jù)。YUV是一種顏色編碼方法。"Y'表示明亮度(Luminance>Luma),"U"和"V則

溫馨提示

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

評(píng)論

0/150

提交評(píng)論