肉眼識別二維碼?懂了原理你也可以
原創
中關村在線
2016-09-29 09:26
近日網上瘋傳著一個段子:小偷也利用上高科技手段啦,樓下的便利店抓到一個小偷,他把店里的支付二維碼偷偷換成自己的,店主直到月底結款的時候才發現。事實上這只是一個段子罷了,小偷如果把商店的二維碼偷梁換柱換成自己設計的二維碼,首先這個過程不容易,因為店里粘貼二維碼的位置固定在某一處,而且店內全天候有人,很難找到下手的機會。并且小偷制作的二維碼中心頭像需要跟店里的設計一致,不然很容易被發現。那么二維碼到底是怎么工作的呢?又是怎么被手機所識別的呢?今天我們就來聊聊二維碼的故事。 二維碼發展過程 其實早在1970年,美國易騰邁公司前身Interface Mechanisms就已經發明了二維碼,但直到近幾年才普及起來。二維碼用特定的幾何圖形按照一定規律,在平面上印制出黑白相間的矩形方陣,用來記錄數據符號信息。它的原理和它的哥哥一維條形碼比較像,但一維條形碼的使用受到了較大的限制,有時甚至變得毫無意義。另外,要用一維條形碼表示漢字的場合,顯得十分不方便,且效率很低,所以高密度、高可靠性的二維碼就應運而生了。二維條碼是大容量、高可靠性信息實現存儲、攜帶并自動識讀的最理想的方法。 從上世紀90 年代初,中國物品編碼中心將二維碼技術引進中國,隨著國外二維碼制在中國不斷拓展,人們逐漸發現了一個問題,由于PDF417、QR等國外碼制沒有考慮中國漢字編碼的問題,在我國使用時,經常會出現中國漢字信息表示效率不高等問題。在2003年至2005年,中國物品編碼中心與我國網路暢想、意銳新創公司共同研發的漢信碼碼制,正式開啟了中國二維碼的新篇章。隨著漢信碼技術的發展成熟與國家標準的制定,我國二維碼產業和應用發展有了自主知識產權二維碼碼制標準的支持,適合中國需求的二維碼民族產業開始起步。 到了今天,隨著iPhone、Android等智能手機軟硬件平臺的發展成熟,騰訊公司、百度公司等互聯網巨頭開始在二維碼上投入巨額資源研發和推廣,二維碼的移動應用市場被培養起來,公眾對于二維碼,特別是手機二維碼認知逐漸成熟。用于手機識讀的二維碼廣泛出現在廣告、網頁、招牌、票據等載體上,手機“掃一掃”,實現移動獲取信息或上網、添加微信、微博關注等應用,已經走入千家萬戶,悄無聲息的改變著我們的生活。 二維碼是怎么生成的 二維碼其實就是由很多0、1組成的數字矩陣。二維碼是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的;在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現信息自動處理:它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符占有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的信息自動識別功能、及處理圖形旋轉變化等特點。二維條碼/二維碼能夠在橫向和縱向兩個方位同時表達信息,因此能在很小的面積內表達大量的信息。 下面我們看看一個二維碼的樣例: 二維碼內容“中關村在線” 簡單的說,二維碼就是把你想表達的信息翻譯成黑白兩種小方塊,然后填到這個大方塊中。有點類似我們中學的答題卡,就是把我們的語言翻譯成機器可識別的語言,說白了就是把數字、字母、漢字等信息通過特定的編碼翻譯成二進制0和1,一個0就是一個白色小方塊,一個1就是一個黑色小方塊。 當然這其中還有很多糾錯碼,假如需要編碼的碼字數據有100個,并且想對其中的一半,也就是50個碼字進行糾錯,則計算方法如下。糾錯需要相當于碼字2倍的符號,因此在這種情況下的數量為50個×2=100碼字。因此,全部碼字數量為200個,其中用作糾錯的碼字為50個,也就是說在這個二維碼中,有25%的信息是用來糾錯的,所以這也就解釋了二維碼即使缺了一點或者變皺了也一樣能被識別。有些朋友可能會問,為什么每個二維碼上都會有三個黑色大方塊呢?那就要涉及下面的內容:手機是如何識別二維碼的。 二維碼怎么被手機識別的? 由于不同顏色的物體,其反射的可見光的波長不同,白色物體能反射各種波長的可見光,黑色物體則吸收各種波長的可見光.所以當攝像頭掃描黑白相間的二維碼上時,手機利用點運算的閾值理論將采集到的圖象變為二值圖像,即對圖像進行二值化處理,得到二值化圖像后,對其進行膨脹運算,對膨脹后的圖象進行邊緣檢測得到條碼區域的輪廓。 圖片來自互聯網 然后經過一項灰度值計算公式對圖像進行二值化處理。得到一幅標準的二值化圖像后,對該符號進行網格采樣,對網格每一個交點上的圖像像素取樣,并根據閾值確定是深色“1”還是淺色“0”,從而得到二維碼的原始二進制序列值,然后對這些數據進行糾錯和譯碼,最后根據條碼的邏輯編碼規則把這些原始的數據轉換成數據。 上文中我們提到的三個大黑方塊起什么作用呢?我們在使用手機掃描的時候無論是什么方向,都能夠正確識別二維碼的內容,就是因為手機通過三個大黑方塊識別出二維碼正確的方向。上述識別過程說起來分很多步驟,但在實際生活中,也就是兩三秒的工夫,非常快! 肉眼怎么識別二維碼? 在《最強大腦》中,有一期選手居然用肉眼識別二維碼,不是一個兩個,也不是十個二十個,而是102個。筆者聽到就冷汗涔涔啊。。。 那么二維碼是怎么用肉眼識別的呢?我們從二維碼的最右邊開始,依次從上往下記錄黑白的分布情況,黑的為1,白的為0。一排記錄好后,往左記錄一排的情況,一直記錄到最左邊為止。但是如果出現一圈方框的,則此部分跳過不記。 然后我們去查Unicode表,將轉換成十六進制的編碼找出對應的Unicode值轉換成對應的文字。剛剛的u4e2d、u5173、u6751、u5728、u7ebf,轉換后對應“中關村在線”五個字。 小結:看到這相信大家對二維碼應該有所了解了吧。雖然二維碼給我們生活帶來了諸多便利,但我們在掃描二維碼的時候一定要多一份警惕,要輕易掃描二維碼,一定要在正規店面、官方工作人員的指導下掃描,或通過官方網站下載APP、關注公眾號。避免掃描到被“劫持”的二維碼,引起經濟損失。 |
|