二維碼識別

0 前言

1 什麼是二維碼

二維碼 (2-dimensional bar code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分佈的黑白相間的圖形記錄資料符號資訊的。

在許多種類的二維條碼中,常用的碼制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

二維條碼/二維碼可以分為堆疊式/行排式二維條碼和矩陣式二維條碼。

1.堆疊式/行排式二維條碼,堆疊式/行排式二維條碼又稱堆積式二維條碼或層排式二維條碼,其編碼原理是建立在一維條碼基礎之上,按需要堆積成二行或多行。它在編碼設計、校驗原理、識讀方式等方面繼承了一維條碼的一些特點,識讀裝置與條碼印刷與一維條碼技術相容。但由於行數的增加,需要對行進行判定,其譯碼演算法與軟體也不完全相同於一維條碼。有代表性的行排式二維條碼有:Code 16K、Code 49、PDF417、MicroPDF417 等。

2.矩陣式二維碼,最流行莫過於QR CODE ,我們常說的二維碼就是它了。矩陣式二維條碼(又稱棋盤式二維條碼)它是在一個矩形空間通過黑、白畫素在矩陣中的不同分佈進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其他形狀)的出現表示二進位制“1”,點的不出現表示二進位制的“0”,點的排列組合確定了矩陣式二維條碼所代表的意義。矩陣式二維條碼是建立在計算機影象處理技術、組合編碼原理等基礎上的一種新型圖形符號自動識讀處理碼制。具有代表性的矩陣式二維條碼有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。

二維碼在現實生活中的應用越來越普遍由於QR CODE的流行,二維碼又稱QR code。

2 QR碼的特點

1.儲存大容量資訊

傳統的條形碼只能處理20位左右的資訊量,與此相比,QR碼可處理條形碼的幾十倍到幾百倍的資訊量。

另外,QR碼還可以支援所有型別的資料。(如:數字、英文字母、日文字母、漢字、符號、二進位制、控制碼等)。一個QR碼最多可以處理7089字(僅用數字時)的巨大資訊量。

2.在小空間內列印

QR碼使用縱向和橫向兩個方向處理資料,如果是相同的資訊量,QR碼所佔空間為條形碼的十分之一左右。(還支援Micro QR碼,可以在更小空間內處理資料。)
這裡寫圖片描述

3.有效表現各種字母

QR碼是日本國產的二維碼,因此非常適合處理日文字母和漢字。QR碼字集規格定義是按照日本標準“JIS第一級和第二級的漢字”制定的,因此在日語處理方面,每一個全形字母和漢字都用13位元的資料處理,效率較高,與其他二維碼相比,可以多儲存20%以上的資訊。
這裡寫圖片描述

4.對變髒和破損的適應能力強

QR碼具備“糾錯功能”,即使部分編碼變髒或破損,也可以恢復資料。資料恢復以碼字為單位(是組成內部資料的單位,在QR碼的情況下,每8位元代表1碼字),最多可以糾錯約30%(根據變髒和破損程度的不同,也存在無法恢復的情況)。

5.可以從任意方向讀取

QR碼從360°任一方向均可快速讀取。其奧祕就在於QR碼中的3處定點陣圖案,可以幫助QR碼不受背景樣式的影響,實現快速穩定的讀取。
這裡寫圖片描述

6.支援資料合併功能

QR碼可以將資料分割為多個編碼,最多支援16個QR碼。使用這一功能,還可以在狹長區域內列印QR碼。另外,也可以把多個分割編碼合併為單個資料。
這裡寫圖片描述

3 QR碼的資訊量和版本

QR碼設有1到40的不同版本(種類),每個版本都具備固有的碼元結構(碼元數)。(碼元是指構成QR碼的方形黑白點。)

“碼元結構”是指二維碼中的碼元數。從版本1(21碼元×21碼元)開始,在縱向和橫向各自以4碼元為單位遞增,一直到版本40(177碼元×177碼元)。
這裡寫圖片描述

QR碼的各個版本結合資料量、字元型別和糾錯級別,均設有相對應的最多輸入字元數。也就是說,如果增加資料量,則需要使用更多的碼元來組成QR碼,QR碼就會變得更大。

例如,需要輸入的資料為100位的數字時,通過以下步驟來選定。
1.假設要輸入的資料種類為“數字”
2.從“L”“M”“Q”“H”中選擇糾錯級別。(假設選擇“M”)
3.檢視下錶,先從數字列找出數字為100以上且接近100的,其次找出糾錯級別“M”,兩者交叉的部分就是最佳版本。
這裡寫圖片描述

通過下面的計算為每個字元型別,總位元數的計算方法。
這裡寫圖片描述

4 QR碼的糾錯

QR碼具有“糾錯功能”。即使編碼變髒或破損,也可自動恢復資料。這一“糾錯能力”具備4個級別,使用者可根據使用環境選擇相應的級別。調高階別,糾錯能力也相應提高,但由於資料量會隨之增加,編碼尺寸也也會變大。
使用者應綜合考慮使用環境、編碼尺寸等因素後選擇相應的級別。 在工廠等容易沾染贓物的環境下,可以選擇級別Q或H,在不那麼髒的環境下,且資料量較多的時候,也可以選擇級別L。一般情況下使用者大多選擇級別M(15%)。
這裡寫圖片描述
糾錯級別的比率,是指全部碼字與可以糾錯的碼字的比率。
例如,需要編碼的碼字資料有100個,並且想對其中的一半,也就是50個碼字進行糾錯,則計算方法如下。糾錯需要相當於碼字2倍的符號(RS編碼※),因此在這種情況下的數量為50個×2=100碼字。因此,全部碼字數量為200個,其中用作糾錯的碼字為50個,所以計算得出,相對於全部碼字的糾錯率就是25%。這一比率相當於QR碼糾錯級別中的“Q”級別。

另外,在上述例子當中,也可以認為相對於碼字資料的糾錯率為50%,但變髒或破損的部位不僅僅侷限於碼字資料部分,因此,在QR碼中,還是用相對於全部碼字的比率來描述糾錯率。

※ RS編碼:QR碼的糾錯功能是通過將RS編碼附加到原資料中的方式實現的。RS編碼是應用於音樂CD等用途的數學糾錯方法。它能以位元組為單位進行糾錯,適合用於錯誤位置會集中的突發錯誤。

5 QR碼的種類

這裡寫圖片描述

6 QR碼的基本結構

QR(Quick-Response) code是被廣泛使用的一種二維碼,解碼速度快。它可以儲存多用型別,下圖是qrcode的基本結構:
這裡寫圖片描述
位置探測圖形、位置探測圖形分隔符、定點陣圖形:用於對二維碼的定位,對每個QR碼來說,位置都是固定存在的,只是大小規格會有所差異;
校正圖形:規格確定,校正圖形的數量和位置也就確定了;
格式資訊:表示改二維碼的糾錯級別,分為L、M、Q、H;

版本資訊:即二維碼的規格,QR碼符號共有40種規格的矩陣(一般為黑白色),從21×21(版本1),到177×177(版本40),每一版本符號比前一版本 每邊增加4個模組。

資料和糾錯碼字:實際儲存的二維碼資訊,和糾錯碼字(用於修正二維碼損壞帶來的錯誤)。

7 QR碼的編碼過程

下面是簡要QR編碼過程:

1.資料分析:確定編碼的字元型別,按相應的字符集轉換成符號字元; 選擇糾錯等級,在規格一定的條件下,糾錯等級越高其真實資料的容量越小。

2.資料編碼:將資料字元轉換為位流,每8位一個碼字,整體構成一個資料的碼字序列。其實知道這個資料碼字序列就知道了二維碼的資料內容。

容量如下:

格式容量
數字最多7089字元
字母最多4296字元
二進位制數(8 bit)最多2953位元組
日文漢字/片假名最多1817字元(採用Shift JIS)
中文漢字最多984字元(採用UTF-8)
中文漢字最多1800字元(採用BIG5)

模式編碼如下:

模式指示符
ECI0111
數字0001
字母數字0010
8位位元組0100
日本漢字1000
中文漢字1101
結構連結0011
FNCI0101(第一位置)
1001(第二位置)
終止符(資訊結尾)0000

資料可以按照一種模式進行編碼,以便進行更高效的解碼,例如:對資料:01234567編碼(版本1-H),
1)分組:012 345 67
2)轉成二進位制:
012→0000001100
345→0101011001
67 →1000011
3)轉成序列:0000001100 0101011001 1000011
4)字元數 轉成二進位制:8→0000001000
5)加入模式指示符(上圖數字)0001:0001 0000001000 0000001100 0101011001 1000011

對於字母、中文、日文等只是分組的方式、模式等內容有所區別。基本方法是一致的。

3.糾錯編碼:按需要將上面的碼字序列分塊,並根據糾錯等級和分塊的碼字,產生糾錯碼字,並把糾錯碼字加入到資料碼字序列後面,成為一個新的序列。

糾錯等級糾錯水平
L7%字碼修正
M15%字碼修正
Q25%字碼修正
H30%字碼修正

在二維碼規格和糾錯等級確定的情況下,其實它所能容納的碼字總數和糾錯碼字數也就確定了,比如:版本10,糾錯等級時H時,總共能容納346個碼字,其中224個糾錯碼字。

就是說二維碼區域中大約1/3的碼字時冗餘的。對於這224個糾錯碼字,它能夠糾正112個替代錯誤(如黑白顛倒)或者224個據讀錯誤(無法讀到或者無法譯碼),這樣糾錯容量為:112/346=32.4%。

4.構造最終資料資訊:在規格確定的條件下,將上面產生的序列按次序放如分塊中。

按規定把資料分塊,然後對每一塊進行計算,得出相應的糾錯碼字區塊,把糾錯碼字區塊 按順序構成一個序列,新增到原先的資料碼字序列後面。
如:D1, D12, D23, D35, D2, D13, D24, D36, … D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,…

5.構造矩陣:將探測圖形、分隔符、定點陣圖形、校正圖形和碼字模組放入矩陣中。

8 QR碼的應用

QR碼可以很“方便”地應用於各種場合。除了傳單和名片等印刷物之外,還可以應用於各種廣泛領域,如結算系統等與生活息息相關的領域以及工廠、流通等各種商業領域。QR碼已經成為日常生活不可或缺的工具。2012年,公益財團法人日本設計振興會對QR碼錶示了高度評價,由於QR碼的功能非常貼近生活,設計精緻,在其主辦的設計推薦制度中授予QR碼“優秀設計獎”。

9 QR碼的標準化

“想讓更多人使用QR碼”,秉承這一理念,DENSO WAVE全面公開了QR碼的相關標準。目前,QR碼已經在國家標準和國際標準中實現標準化,任何人都可以隨意檢視該標準。

※DENSO WAVE INCORPORATED已宣佈,不行使本公司就標準QR碼擁有的專利權(專利第2938338號)。

1997年 10月 被採納為AIM International(國際自動識別工業會)標準(ISS – QR Code)
1998年 3月 被採納為JEIDA(日本電子工業振興協會)標準(JEIDA-55)
1999年 1月 被採納為JIS(日本工業標準)(JIS X 0510)
2000年 6月 被採納為ISO國際標準 (ISO/IEC18004)
2004年 11月 Micro QR碼被採納為JIS(日本工業標準)(JIS X 0510)
2011年 12月 國際標準化組織GS1將QR碼採納為面向移動終端的標準

QR碼的簡要標準
這裡寫圖片描述

QR碼標準檔案下載

QR碼在ISO(ISO/IEC18004)中得到 標準化。因此,請從以下團體的網站購買QR碼標準檔案,在下面網址中搜尋18004。

http://www.iso.ch/iso/en/prods-services/ISOstore/store.html

不過2016標準版的價格略貴,可到本人的資源中下載2006標準版的,連結如下:

http://download.csdn.net/detail/u012611878/9687105

另外,這裡提供一個c 編寫的qrcode編碼解碼工具,基於zxing的編碼庫,libqrcode的解碼庫,通過命令列完成二維碼圖片與文字之間的相互轉換,連結如下:

http://download.csdn.net/detail/u012611878/9705048

歡迎下崽。

開源專案

zxing/zxing
oostendo/python-zxing
ZBar/ZBar
Polyconseil/zbarlight

參考資料

二維碼的生成和解析原理
二維碼(QR code)基本結構及生成原理
二維碼的生成細節和原理