【轉載】裸眼識別二維碼

  一個開關的開合狀態能夠對應「0、1」兩個信號,萊布尼茨三百多年前留下的這個制式影響深遠。平常語言依賴於思惟邏輯,與之相似,數字語言的流通則依賴於數學邏輯,但本質上仍然只是無數個與非門的邏輯計算。所以相比於計算機,咱們的計算能力雖然在效率方面有點難以啓齒,但這並不表明有些事情咱們註定辦不到。html

好比靠肉眼識別二維碼?雖然人類大腦的計算效率早已落後家用計算機好幾個量級,但這並不妨礙咱們光靠人腦去完成一件「看似只有電子設備才能完成的事情」的嘗試。前端

 

  咱們在生活中消費、轉帳時用手機掃的二維碼,屬於QR code(Quick Response)。但除了QR code以外,二維碼還有其餘多種制式標準,好比Data Matrix、PDF41七、Ultra-code——本文只討論QR碼這個生活場景中最多見的二維碼制,由於……其餘的我也不會。程序員

條碼技術最先須要追溯到上世紀20年代,當時美國威斯汀豪斯(Westinghouse)實驗室的發明家約翰·科芒德(John Kermode)爲了實現對郵政單據的自動分檢,發明了一種用條碼對單據作標記的機制(一個條表示數字「1」,二個條表示數字「2」,稱爲模塊比較法),以及相應的譯碼器。算法

可是這種始祖鳥級別的制式所蘊含的信息量極低,不久後科芒德的合做者道格拉斯·楊(Douglas Young)對此進行了改進,利用黑條之間空隙的尺寸變化來編碼數據。兩人在1949年得到了世界上第一個條碼專利,這種最先期的條碼由黑白相間的同心圓組成,被稱爲牛眼式條碼。學習

另外一說法稱,牛眼式條紋是由工程師諾曼·伍德蘭(Norman J. Woodland)發明的ui

現現在,咱們已經對掃碼購物的行爲很是習慣了,但在條碼技術普及以前,超市的出納員只能靠敲鍵盤來輸入商品價格,操做成本高不說,患有腱鞘炎的人也不在少數,簡直成了職業病。條碼技術的出現無疑節省了不少工做成本,更況且條碼自己也伴隨着硬件技術實現一次次的更迭和普及。編碼

欲求不盡是人類的美好品德。條形碼雖然帶來了極大的便利,可是容量依舊有限,只容納20個英文和數字,且沒法編碼漢字和假名。當時的制碼人員幾乎分紅了兩類,一類研究怎麼往條碼裏塞更多的信息,一類研究怎麼更快解碼。大多數人屬於第一類,而當時正在日本豐田子公司DensoWave從事條形碼讀取機研發的原昌宏開始嘗試研發更快速的編碼制式,進過一年半的研發過程,纔有了1994年QR code碼制的發明。翻譯

碼如其名,這一碼制的最大特色即是「Quick Response」——快速響應,讀取速度比其餘編碼制式快10倍以上,最早被用在汽車零部件生產行業的電子看板管理(負責傳遞信息和生產管理的系統之一)中,大大提升了生產、出貨乃至單據的管理效率。code

做爲一個男性程序員,原昌宏對於「快」有着獨特的理解。他認爲要想在應用條碼的過程當中實現快速,核心是解決識別的問題,剩下的內容只是計算。orm

 

——如何才能讓機器快速找到目標碼區?

用特殊形狀的符號標記區域。——

——如何肯定碼區所在平面?

用三個特殊形狀的標記(三點肯定一個平面)。——

——如何肯定機器讀取碼區的方向?

設置好從某一標記出發,以及出發的方向就能夠了。——

邏輯沒有問題,剩下要解決的就是標記的形狀。若是編碼周圍有相同的圖案,讀取時就會被誤認爲是編碼信息,從而致使誤讀,所以定位圖案必定要保證特殊性。原昌宏爲此收羅了大量廣告單、雜誌等印刷品,從各個方向進行掃描,並作了黑白色的二值處理,分析黑白佔比,從而得出結論:黑白間隔比爲1:1:3:1:1的比例定位的時,在印刷品中出現的機率最低。

如下方二維碼爲例,三個分別位於二維碼的左上角、右上角、左下角的「回」字形符號,即是規定了尺寸、讀取方向的位置探測圖形。有這三個識別符號放在二維碼的三個角上後,解碼的時間響應就能夠很快,比同時代的技術要快20倍。 這即是肉眼識別二維碼所要了解的第一個知識點:

用位置探測圖形肯定碼區。

此外,該制式還規定在與位置探測圖形接壤的碼區部分均爲空白,以防止對位置探測圖形產生識別干擾,這即是位置探測圖形分隔符(下圖中藍色區域)。

再考慮到印有二維碼的載體在實際應用場景中可能會發生的扭曲、移位和破損,制式還規定了一種與位置探測圖形相相似的「回」字形圖案(1:1:1:1:1),用來輔助定位減小偏差,這即是校訂圖形(僅在版本2以上存在)。

 

但若是連校訂圖形也被污染了呢?還有定位圖形(下圖黃色區域),這是平行於二維碼邊緣的兩條黑白交替出現的直線,與位置探測圖形分隔符相接,用於肯定二維碼的角度,糾正扭曲。

上面介紹的四個圖形均屬於功能區域,都是爲了保證QR碼能被讀碼設備正確獲取,不存儲具體數據信息。在學習肉眼識別二維碼的過程當中,咱們只要找獲得它們就夠了。

那麼在剩下來的編碼區裏,究竟能夠存儲多少信息?答案是試規格而定。爲了節省空間,QR碼符號共有40種規格的矩陣,從最小的21x21(版本1)到最大177x177(版本40),每一版本符號比前一版本每邊增長4個模塊。版本1的二維碼最多能夠儲存25個字符或41個數字,而版本40的二維碼最多能夠儲存4296個字符或7089個數字。

在下圖的版本1二維碼中,只有未被紅黃藍三色填充的幾塊碼區爲咱們所須要的數據存儲區。信息將經過特定算法轉換成黑色和白色的小方格填充其中,但即使咱們知道了該看哪些區域,離最終解碼還有些距離。

再往下細分,數據存儲區又能夠分紅三類:數據編碼、糾錯編碼,以及表明格式字符串的碼區。第一種天然沒必要說,是咱們最終須要使用的區域。至於糾錯編碼,這裏不得不提到QR碼的另一大特色——高容錯率。

平常生活裏,沿街餐館裏貼在桌角用於收款的二維碼大概是最容易受損的了。印有二維碼的小紙片這邊磨破一個角,那邊沾了點醬油,碼區可能早已再也不完整。糾錯編碼的做用便體如今這裏,經過對數據碼進行RS糾錯計算(裏德-所羅門碼算法)獲得與之對應的糾錯碼,以此來保證二維碼的可讀性。當數據碼區受到污染的時候,讀碼器依舊能夠憑藉糾錯碼獲得正確信息。

根據糾錯能力的不一樣,糾錯碼共分紅L、M、Q、H 4個級別,分別可修正7%、15%、25%、30%的字碼。關於糾錯碼的級別信息便記錄在數據區的第三塊內容——格式字符串中(即下圖紅色部分),這是咱們須要處理的第一組數據。

格式字符串所蘊含的信息除了糾錯等級之外,還包括表示掩碼類型的信息。所謂的掩碼,粗暴理解是爲了讓二維碼更加容易被機器識別而定義的一次計算過程,下降了二維碼自己被誤讀的可能性,使整個二維碼碼區排列更均勻,更容易被識別。

QR碼制式中一共定義了7種掩碼類型,每一種又能夠根據4個糾錯碼級別產生4個變種,對於同一個信息便有了4*7=28種加工可能。所以只有肯定了糾錯等級和掩碼類型,才能正式進入對數據的處理階段,而咱們首先須要獲得的即是掩碼的類型。

黑塊爲「1」,白塊爲「0」。格式字符串數據的翻譯方向爲從上往下(或從右到左),需注意當從右往左進行翻譯的時候,右邊半段紅色區域的左端與左邊半段紅色區域的右端是重複信息,只取其中一位。基於上述算法法則,咱們很快能夠獲得格式字符串信息(紅色區域,如上圖所示)——110011000101111,再查閱格式字符串表可得出結論:該二維碼所採用的糾錯級別爲L,掩碼模式4(下圖正中所示掩碼模式)。

接下來便須要對掩碼進行逆向計算。所謂掩碼其實很好理解——這是一個把數據區裏的黑白小方塊拆散的過程,每種掩碼類型所規定的圖像模型中,黑色區域表示原始碼區的該位置須要顛倒一次黑白(數值反轉),白色區域保持不變,以此來打散碼區。所以咱們能夠根據掩碼模式4的圖形來推算這個二維碼在掩碼處理以前的狀態。

終於等到從圖形碼變成數字的一刻。對於上圖左側咱們得出的結論圖,咱們定義白塊爲0,黑塊爲1,從最右下角的模塊開始進行記錄,能夠很輕易獲得一串數列。下圖是一個附帶校訂圖形(紫色部分)與版本信息(藍色部分)的二維碼示意圖,紅線所示爲閱讀方向。

該數列爲:

01000000  00110110

01010110  11100110

01000000  ……

接下來的工做即是對這串數字進行換算。不管是編碼仍是解碼,咱們都但願二維碼可以以最短的比特串記錄數據,所以編碼開始以前便會對四種數據形式(數字、字母數字、漢字,8位字節)進行編碼方式的選擇,在後期獲得的二進制數列中也能找到每個編碼方式獨有的二進制標識,這些標識會記錄在數據區的前端(即圖中右下角四個小方塊的位置),使得解碼器能夠根據二維碼使用的編碼方式對數據進行解碼。

編碼方式一般用4位數字表示,所以咱們單拎出開頭的4個數字「0100」,對照下表可查到對應的模式爲字節模式。

8位字節模式所使用的是ASCII字符集,每一個字符都須要用8位二進制碼進行表示。而在表明編碼模式的4個數字後面,咱們仍須要再拎出來8個數字「00000011」,這組數字所表示的是原數據的字符數,十進制爲3,即原數據共有三個字節。

所以這組數據應該這樣排列:

0100  00000011

01100101  01101110

01100100  0000……

在二維碼的解碼過程當中,「0000」表明的是原始數據的結束。但QR碼對每種版本都規定了具體位數,所以後面的數據碼每每由補齊碼和大量糾錯碼組成。

補齊碼的設置其實特別有意思。在終止符出現後,須要先將位數用「0」補到8的倍數。若是還不夠,則須要日後頭重複兩組字節:11101100 、00010001。這些字節分別等於236和17,在二維碼裏的地位有如開普勒常數之於太陽系,天然常數之於天然。具體爲什麼如此規定,若悉知,望告知。

至於糾錯碼,雖然本文很少作介紹,可是因爲在大容量二維碼中(版本高於4),最後呈現出來的碼是經過將數據碼和糾錯碼進行從新排布,再套用掩碼模型製做出來的,所以沒法用前文的方法進行計算。

 

最後的最後,咱們最後倒騰出來的三組字節換算成10進制後分別是10一、1十、100,查詢下表就能夠看到這張二維碼的數據信息,肉眼識別二維碼——目標達成。

 

 

轉載地址:http://news.ifeng.com/a/20171013/52617019_0.shtml

相關文章
相關標籤/搜索