淺談“碼”

一、 碼的歷史來(lái)源:

1948年,有兩個(gè)年輕人伯納德·希爾弗和諾曼·伍德蘭讀研期間,聽(tīng)到食品連鎖超市董事長(zhǎng)與校長(zhǎng)的談話。
董事長(zhǎng)希望學(xué)校能幫助他們研制一個(gè)設(shè)備,在收銀員結(jié)賬時(shí),可以自動(dòng)得到商品的信息。引起他倆的興趣


諾曼·伍德蘭-喬治·勞雷爾-伯納德·希爾弗.jpeg
圓形碼.jpeg

1949年10月20日,他們提交專利申請(qǐng),詳細(xì)闡明條形碼的結(jié)構(gòu)和讀碼器的設(shè)計(jì)原理。
1952年10月7日,這項(xiàng)專利被批準(zhǔn),雖然伍德蘭為自己設(shè)想的圓形碼申請(qǐng)了專利,當(dāng)時(shí)卻沒(méi)有足夠的計(jì)算技術(shù)來(lái)開(kāi)發(fā)

1970年代喬治·勞雷爾在IBM擔(dān)任工程師時(shí),開(kāi)發(fā)了如今長(zhǎng)方形的通用產(chǎn)品代碼(UPC),即俗稱的條形碼,勞雷爾認(rèn)為,用條紋而非圓圈要更好——他覺(jué)得伍德蘭的圖案太大了,掃描和印刷的時(shí)候都容易出現(xiàn)問(wèn)題

二、條形碼的組成和讀碼器

在組成它的12位數(shù)字中,國(guó)別代碼2位,廠商代碼4位,產(chǎn)品代碼5位,校驗(yàn)碼1位;在黑白粗細(xì)條紋中,黑線條為0,白線條為1,不同的粗細(xì)代表0和1的個(gè)數(shù)不同。按照這樣的辦法,就可以把十進(jìn)位的自然數(shù)0,1,2,…,8,9等改變?yōu)槎M(jìn)制的0和1的組合

讀碼器自帶激光光源,它從條形碼的反光中接收到0和1的電脈沖信號(hào),根據(jù)信號(hào)的持續(xù)時(shí)間,判斷條形碼的線條寬度和所用的編碼類別,再根據(jù)編碼規(guī)則就可以將所收到的信號(hào)轉(zhuǎn)換為0~9的數(shù)字。如果讀碼器裝有識(shí)別數(shù)字功能的軟件,還可以直接讀出條形碼下方的數(shù)字,當(dāng)信號(hào)快速地傳回計(jì)算機(jī)時(shí),從計(jì)算機(jī)數(shù)據(jù)庫(kù)中就可以直接調(diào)出產(chǎn)品的信息

三、一維碼的定義和優(yōu)缺點(diǎn)

一維碼:(條形碼)的數(shù)據(jù)容量較小(30 個(gè)字符左右)、只能包含字母和數(shù)字。
優(yōu)點(diǎn):
1.提高效率 :條碼掃描設(shè)備能迅速讀取商品信息
2.便于識(shí)別 :掃描閱讀器掃過(guò)條形碼標(biāo)簽時(shí),計(jì)算機(jī)能夠自動(dòng)進(jìn)行閱讀識(shí)別,迅速確定商品的代碼
3.加強(qiáng)安全性:有效防止商品盜竊和假冒,從而保護(hù)消費(fèi)者的權(quán)益,每個(gè)條形碼都有唯一對(duì)應(yīng)的數(shù)據(jù),增強(qiáng)了防偽能力
4.采集信息量大:傳統(tǒng)的一維條形碼每次可以讀取幾十個(gè)字符的信息,而二維條形碼的容量更大,能夠攜帶數(shù)千個(gè)字符的信息
5.降低成本:作為一種成本較低的標(biāo)記技術(shù),條形碼相較于手寫(xiě)或單獨(dú)貼紙更為經(jīng)濟(jì)實(shí)用
6.管理方便:主要體現(xiàn)在庫(kù)存和物流管理的信息化與自動(dòng)化
7.節(jié)省人力:通過(guò)“掃一掃,條碼追溯等”功能,企業(yè)可以快速、準(zhǔn)確地獲取商品信息,從而進(jìn)行比質(zhì)比價(jià)。這不僅簡(jiǎn)化了庫(kù)存管理,還減少了人工輸入錯(cuò)誤,進(jìn)一步提高了工作效率

缺點(diǎn):
1.讀取速度慢
2.易受損壞,尺寸相對(duì)較大(空間利用率較低)、遭到損壞后便不能閱讀的缺點(diǎn)暴露出來(lái)
3.有限的存儲(chǔ)信息(由于條形碼的存儲(chǔ)能力有限,必須在單個(gè)產(chǎn)品上應(yīng)用多達(dá) 10 個(gè)條形碼,才能正確跟蹤和傳達(dá)信息
條形碼需要從一個(gè)方向掃描,因此當(dāng)掃描儀無(wú)法讀取各種形狀和尺寸的汽車零部件上的條形碼時(shí),他們就會(huì)遇到生產(chǎn)備份問(wèn)題)
4.局限于特定范圍內(nèi)的識(shí)別,掃描距離上,不適合遠(yuǎn)距離,動(dòng)態(tài)應(yīng)用場(chǎng)景


四、二維碼

1.二維碼的起源

二維碼的發(fā)明人是原昌宏,他被稱為“二維碼之父”。原昌宏于1994年在日本電裝公司開(kāi)發(fā)了二維碼,主要是為了解決制造業(yè)和物流業(yè)的產(chǎn)品管理問(wèn)題。二維碼比條形碼具有更大的信息量和抗污損性能等。為了使二維碼能被廣泛應(yīng)用,原昌宏和日本電裝公司決定完全開(kāi)放二維碼的專利,沒(méi)有收取技術(shù)專利費(fèi)

2.二維碼的定義

用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的、黑白相間的、記錄數(shù)據(jù)符號(hào)信息的圖形,二維碼是一種開(kāi)放性的信息儲(chǔ)存器,能將固定的信息存儲(chǔ)在自己的方塊之間,可以無(wú)限制使用,對(duì)識(shí)別器也沒(méi)有任何要求,任何設(shè)備只要帶掃一掃功能,都可以將他們所儲(chǔ)存的信息讀取出來(lái)。主要有三類分別是線性堆疊式二維碼、矩陣式二維碼、郵政碼

線性堆疊式二維碼
是在一維條碼編碼原理的基礎(chǔ)上,將多個(gè)一維碼在縱向堆疊而產(chǎn)生的。典型的碼制如:Code16K、Code 49、PDF417等。

矩陣式二維碼
是在一個(gè)矩形空間通過(guò)黑、白像素在矩陣中的不同分布進(jìn)行編碼。典型的碼制如:Aztec、Maxi、Code、QRCode、Data、Matrix等。

郵政碼
通過(guò)不同長(zhǎng)度的條進(jìn)行編碼,主要用于郵件編碼,如:Postnet 、 BPO4-State


3.常見(jiàn)的二維碼

包括QR Code、PDF417、Data Matrix、漢信碼

QR Code(Quick Response Code):這是一種矩陣二維碼符號(hào),具有信息容量大、可靠性高、可表示漢字及圖象多種文字信息、保密防偽性強(qiáng)等優(yōu)點(diǎn)。QR Code碼的識(shí)讀過(guò)程所需時(shí)間很短,具有超高速識(shí)讀特點(diǎn),因此廣泛應(yīng)用于工業(yè)自動(dòng)化生產(chǎn)線管理等領(lǐng)域。

PDF417:PDF417是一種行排式二維碼,由美國(guó)Symbol公司發(fā)明。它具有較高的容錯(cuò)率,即使部分區(qū)域被遮擋也能被正常掃描。

Data Matrix:這是一種矩陣式二維碼,由美國(guó)ID Matrix公司發(fā)明。Data Matrix碼的優(yōu)點(diǎn)包括信息密度高、識(shí)別速度快等。

漢信碼:漢信碼是一種由中國(guó)物品編碼中心開(kāi)發(fā)的二維矩陣碼,具有自主知識(shí)產(chǎn)權(quán)。它適合應(yīng)用在政府辦公、食品安全、質(zhì)檢檢察、醫(yī)療衛(wèi)生、移動(dòng)通訊、公安消防、物流供應(yīng)鏈管理等領(lǐng)域。

3.QR code二維碼

QR全稱Quick Response,是一種編碼方式。它比傳統(tǒng)的Bar Code條形碼能存更多的信息,也能表示更多的數(shù)據(jù)類型。
二維碼的基本結(jié)構(gòu)
整體分為功能區(qū)和編碼區(qū),功能區(qū)主要用于定位,編碼區(qū)則是真正存儲(chǔ)數(shù)據(jù)的

二維碼版本信息圖

功能圖形包括位置探測(cè)圖形、位置探測(cè)分隔符、定位圖形、校正圖形四大塊
編碼區(qū)包括格式信息、版本信息、數(shù)據(jù)和糾錯(cuò)碼字三大塊

【位置探測(cè)圖形】三個(gè)就可以標(biāo)識(shí)一個(gè)矩形
【位置探測(cè)分隔符】每個(gè)探測(cè)圖形和編碼區(qū)域之間有一條1單位寬度的分隔符.由白色塊組成
【定位圖形】黑白色相間交替組成的一行一列兩條位于橫縱的兩兩探測(cè)圖形之間,用于確定符號(hào)的密度和版本,提供決定模塊坐標(biāo)的基準(zhǔn)位置

【校正圖形】類似小號(hào)的探測(cè)圖形,中心矩形邊框變?yōu)?單位,這種校正圖形的數(shù)量由version來(lái)定,大于version 1的都有該校正圖形.

【格式信息】表示該二維碼的糾錯(cuò)級(jí)別,分為L(zhǎng)、M、Q、H;

【版本信息】即二維碼的規(guī)格,QR碼符號(hào)共有40種規(guī)格的矩陣(一般為黑白色),從21x21(版本1),到177x177(版本40),每一版本符號(hào)比前一版本 每邊增加4個(gè)模塊。

【數(shù)據(jù)和糾錯(cuò)碼字】使用黑白的二進(jìn)制網(wǎng)格編碼內(nèi)容。8個(gè)格子可以編碼一個(gè)字節(jié)。數(shù)據(jù)是我們需要的信息,糾錯(cuò)碼字用于修正二維碼損壞帶來(lái)的錯(cuò)誤。二維碼所有的模塊中,儲(chǔ)存的并不都是我們需要的信息,甚至只有一小部分才是。在上面的圖中,只有數(shù)據(jù)和糾錯(cuò)碼字中的數(shù)據(jù)才是我們實(shí)際想存儲(chǔ)的數(shù)據(jù)

二維碼檢測(cè)定位

  1. 尋找二維碼的三個(gè)角的定位角點(diǎn),需要對(duì)圖片進(jìn)行平滑濾波,二值化,尋找輪廓,篩選輪廓中有兩個(gè)子輪廓的特征,從篩選后的輪廓中找到面積最接近的3個(gè)即是二維碼的定位角點(diǎn)。

  2. 判斷3個(gè)角點(diǎn)處于什么位置,主要用來(lái)對(duì)圖片進(jìn)行透視校正(相機(jī)拍到的圖片)或者仿射校正(對(duì)網(wǎng)站上生成的圖片進(jìn)行縮放拉伸旋轉(zhuǎn)等操作后得到的圖片)。需要判斷三個(gè)角點(diǎn)圍成的三角形的最大的角就是二維碼左上角的點(diǎn)。然后根據(jù)這個(gè)角的兩個(gè)邊的角度差確定另外兩個(gè)角點(diǎn)的左下和右上位置。

  3. 根據(jù)這些特征識(shí)別二維碼的范圍。

二維碼識(shí)別即譯碼

二維碼識(shí)別即譯碼

1.定位并獲取符號(hào)圖像。深色與淺色模塊識(shí)別為“ 0”與“1”的陣列。
2.識(shí)讀格式信息(如果需要,去除掩模圖形并完成對(duì)格式信息模塊的糾錯(cuò),識(shí)別糾錯(cuò)等級(jí)與掩模圖形參考。)
3.識(shí)讀版本信息,確定符號(hào)的版本
4.用掩模圖形參考已經(jīng)從格式信息中得出對(duì)編碼區(qū)的位圖進(jìn)行異或處理消除掩模
5.根據(jù)模塊排列規(guī)則,識(shí)讀符號(hào)字符,恢復(fù)信息的數(shù)據(jù)與糾錯(cuò)碼字
6.用與糾錯(cuò)級(jí)別信息相對(duì)應(yīng)的糾錯(cuò)碼字檢測(cè)錯(cuò)誤,如果發(fā)現(xiàn)錯(cuò)誤,立即糾錯(cuò)
7.根據(jù)模式指示符和字符計(jì)數(shù)指示符將數(shù)據(jù)碼字劃分成多個(gè)部分
8.按照使用的模式譯碼得出數(shù)據(jù)字符并輸出結(jié)果

里德-所羅門(mén)糾錯(cuò)算法
先要介紹一種糾錯(cuò)方法——極大距離可分法(MDS)。這是一種很常見(jiàn)的糾錯(cuò)方法,它將原始數(shù)據(jù)分成等長(zhǎng)的N份,并根據(jù)這N份數(shù)據(jù)生成M個(gè)冗余的校驗(yàn)數(shù)據(jù)。此時(shí),M+N塊數(shù)據(jù)中任意M塊數(shù)據(jù)損失,也可以通過(guò)剩余N塊數(shù)據(jù)經(jīng)過(guò)計(jì)算來(lái)恢復(fù)原始數(shù)據(jù)。

數(shù)據(jù)備份與修復(fù)的技術(shù)——里德所羅門(mén)編碼

簡(jiǎn)單舉例展示下里德所羅門(mén)編碼

里德所羅門(mén)編碼可以隨便修改一定量的格子,機(jī)器都能自動(dòng)還原成正確的數(shù)據(jù)
為更好的解釋這一過(guò)程,我們簡(jiǎn)化成4個(gè)格子,格子中的數(shù)字是1,2,3,4,任意修改兩個(gè)格子的數(shù)據(jù),算法都可以發(fā)現(xiàn)錯(cuò)的是哪一個(gè),并且還原成修改前的數(shù)據(jù)
錯(cuò)誤位置e1,e2
錯(cuò)誤大小y1,y2


假設(shè)e1 = 3, e2 = 1; y1 = -5, y2 = 1;機(jī)器可以自動(dòng)調(diào)整成正確的數(shù)據(jù)


在計(jì)算這4個(gè)未知數(shù)之前,還得先讓機(jī)器知道這串?dāng)?shù)字錯(cuò)了
最簡(jiǎn)單的方法就是算0,算出了0就是對(duì)的,不是0就是錯(cuò)的

比如,我們的設(shè)備可以保存一個(gè)固定值g=1234,輸入數(shù)值m(1234) 減去 固定值g(1234),就剛好等于0

若輸入值為5678,結(jié)果就不是0,這時(shí)需要根據(jù)輸入值和固定值反推出一個(gè)P,無(wú)論想輸入什么,都能算出0,這個(gè)P是糾錯(cuò)碼
若固定值g = 100, 輸入值為5678,那么糾錯(cuò)碼P就可以是-5578


若輸入變成1234,P就會(huì)跟著變成-1134

若輸入值被改成6234,糾錯(cuò)碼不變,結(jié)果就不是0,機(jī)器就知道輸入錯(cuò)了


糾錯(cuò)碼P和輸入值m 都會(huì)出現(xiàn)在二維碼上

新問(wèn)題:糾錯(cuò)碼被修改了,怎么辦?
還需要進(jìn)一步研究,若m + p -100 不等于0,我們不知道m(xù) 和 p哪個(gè)錯(cuò)了?

思考:把m 和 p 組合成一個(gè)數(shù)字,比如1234xxxx?
用加減法,也不可能等于0,用除法試一下

新問(wèn)題:1. 3的倍數(shù)很多,很多錯(cuò)誤情況一樣可以得到0;2. 即使得到一個(gè)余數(shù),也無(wú)法知道哪一位數(shù)錯(cuò)了多少?

這時(shí)需要改變計(jì)算規(guī)則了,該伽羅瓦域上場(chǎng)了?。?!
伽羅瓦域是一種有限數(shù)域,其值范圍為[0, 2^8-1],即0~255
伽羅瓦域,是一個(gè)封閉的世界,里面的數(shù)不管怎么算,都不會(huì)得到他們之外的結(jié)果

伽羅瓦域中的加法和減法都是一樣的,都是異或算法


可見(jiàn),不管怎么加減,都只能得到域里的數(shù)字,完整運(yùn)算結(jié)果表格如下



乘除法:6*7



完整乘除法運(yùn)算結(jié)果表如下

回到上面的除法,若我們用伽羅瓦域的規(guī)則,就不能用12340000了

這時(shí),需要用到多項(xiàng)式
在多項(xiàng)式中,我們把每個(gè)格子里的數(shù)字作為x的系數(shù),個(gè)字的位數(shù)作為x的次方數(shù)

12340000的多項(xiàng)式,如下圖


既然輸入數(shù)據(jù)變成了多項(xiàng)式,我們要除以的固定值g也應(yīng)該是一個(gè)有x的多項(xiàng)式,即g(x)
我們要得到的4位糾錯(cuò)碼g(x)就有4個(gè)因子


用m(x)除以g(x),得到4位余數(shù)p(x)


把多項(xiàng)式系數(shù)換成數(shù)字,就是1674

把原來(lái)的m(x) 和余數(shù)p(x)相加,得到的新多項(xiàng)式剛好被整除


這個(gè)過(guò)程用公式描述就是這樣:




這樣,我們得到了最終的輸入數(shù)據(jù),和用多項(xiàng)式表示如下圖



隨便修改8個(gè)格子中任意2個(gè),機(jī)器可以完成自動(dòng)修正
首先,系統(tǒng)會(huì)把收到的輸入數(shù)據(jù)變成多項(xiàng)式

現(xiàn)在需要找到錯(cuò)誤位置e1,e2,錯(cuò)誤大小y1,y2,這一切的關(guān)鍵在于四個(gè)隱藏的方程組
我們知道正確的數(shù)據(jù)M(x)/g(x) = 0,那么M(x)等于g(x)乘以一個(gè)固定值h(x)


雖然我們不知道正確情況下,m1,m2,m3,m4,p1,p2,p3,p4是多少,但我們知道錯(cuò)誤情況下,把我們收到的輸入數(shù)據(jù)62241674帶入這4個(gè)方程計(jì)算,能得到4個(gè)不等于0的結(jié)果


而這4個(gè)方程之所以不等于0,是因?yàn)橛?個(gè)地方出錯(cuò),錯(cuò)誤位置e1, e2, 出錯(cuò)大小y1,y2,乘以2的n次方后相加是方程的結(jié)果;而2的n次方又和出錯(cuò)數(shù)字的位置有關(guān)




把位置5和7處的錯(cuò)誤數(shù)字2和6,分別和錯(cuò)誤大小1,7做異或運(yùn)算,得到3和1,那么正確輸入數(shù)據(jù)如下圖


我們把信息編碼成二進(jìn)制,按順序填上原始數(shù)據(jù),再填上計(jì)算后的糾錯(cuò)碼和其他信息,再和掩碼做一次異或運(yùn)算,生成最終的二維碼。


生成二維碼

二維碼能表示多少數(shù)據(jù)?
數(shù)據(jù)容量取決于 編碼方式 + 糾錯(cuò)級(jí)別 + 二維碼版本,下圖為簡(jiǎn)單示例,即選擇 純數(shù)字編碼 + 糾錯(cuò)級(jí)別為M + 二維碼版本為3時(shí),二維碼字符容量為101

二維碼文本數(shù)據(jù)格式
二維碼的識(shí)別結(jié)果主要是文本,而根據(jù)文本格式的不同,掃描器(例如微信,支付寶)又會(huì)做出不同的反應(yīng)(例如打開(kāi)瀏覽器,打開(kāi)通訊錄等),常見(jiàn)文本類型有如下

4.二維碼的生成原理和工作原理

生成原理
用特定的幾何圖形,按編排規(guī)律,在二維方向上分布,采用黑白相間的圖形,記錄數(shù)據(jù)符號(hào)信息,用數(shù)字0,1為代碼,與二進(jìn)制相對(duì)應(yīng)的幾何形體,表示文字?jǐn)?shù)值信息

二維碼生成流程主要分為四步,首先我們將所需要展示的數(shù)據(jù)進(jìn)行數(shù)據(jù)編碼,其次對(duì)于數(shù)據(jù)編碼后的數(shù)據(jù)碼利用里德-所羅門(mén)算法計(jì)算其糾錯(cuò)碼,然后將數(shù)據(jù)碼和糾錯(cuò)碼合并到一起形成的就是最終編碼,最后利用二維碼結(jié)構(gòu)進(jìn)行畫(huà)二維碼流程

工作原理
通過(guò)常見(jiàn)的輸入設(shè)備或光電掃描設(shè)備自動(dòng)讀取并且會(huì)對(duì)識(shí)別出的信息進(jìn)行自動(dòng)處理,因?yàn)槊總€(gè)碼只有自己的字符級(jí),一個(gè)個(gè)點(diǎn)字符占據(jù)自己的位置,通過(guò)掃描能讀取的數(shù)據(jù)
信息在二維碼中的位置是由定位圖形和分隔符決定的,才能快速識(shí)別和處理圖形旋轉(zhuǎn)變化等問(wèn)題

如何獲取當(dāng)前連接wifi密碼并通過(guò)二維碼分享wifi
1.打開(kāi)“設(shè)置”
2.點(diǎn)擊“無(wú)線網(wǎng)絡(luò)”
3.點(diǎn)擊已連接的Wi-Fi
4.點(diǎn)擊“分享網(wǎng)絡(luò)”
5.保存圖片
6.在微信中識(shí)別圖片二維碼,可見(jiàn)wifi 賬號(hào)密碼

參考文獻(xiàn)鏈接:
關(guān)于二維碼的一些必備知識(shí)點(diǎn)
為程序員寫(xiě)的Reed-Solomon碼解釋
MDS算法
里德—所羅門(mén)(Reed-Solomon)糾錯(cuò)算法筆記
QR碼的信息量和版本

學(xué)習(xí)視頻:二維碼解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容