二維碼的生成與識別,Python可以這樣做

  在當前的生活中,二維碼的應用越來越廣泛。網上購物、消費付款、資訊閱讀、生產管理、食品溯源、電子票務、交通出行、會議簽到、活動組織、防偽標誌、個人名片、資料分享等等,都在大量的應用二維碼。

  用某種特定的幾何圖形按一定規律在平面(二維方向上)分佈的、黑白相間的、記錄數據符號信息的圖形;在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現信息自動處理:它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符佔有一定的寬度;具有一定的校驗功能等;還具有對不同行的信息自動識別功能、及處理圖形旋轉變化點。

  經過編制形成的這串編碼中,一個0對應的就是一個白色小方塊,一個1對應的就是一個黑色的小方塊。我們把這些小方塊按照8個一組,填進大方塊裡,這就是一個完整的,可以被手機相機識別的二維碼圖案了。二維條碼有一維條碼沒有的“定位點”和“容錯機制”。不知大家有沒有發現,所有的二維碼都有三個小方塊在邊上。其實這三個方塊是用來定位的,但為什麼是三個呢,簡單說就是三點確定一個面。如果只有一個點,經過這個點有無數個方框,兩個點,有兩個方框,因此就設了三個方塊。所以不管你正著掃、傾斜掃、旋轉180度掃,都能識別出來。”容錯機制“就是在即使沒有辨識到全部的條碼、或是說條碼有汙損時,也可以正確地還原條碼上的信息。

  一、二維碼的生成

1、安裝pillow,qrcode庫

<code>pip install pillow
pip install qrcode/<code>
<code>import qrcode as qrcode
qr = qrcode.QRCode(
version=1, #二維碼的格子矩陣大小
error_correction=qrcode.constants.ERROR_CORRECT_Q,
box_size=10,
border=4,
)
qr.add_data("棲客中國\\r\\n祝您身體健康萬事如意!\\r\\n因為有你,這個世界更精彩!")#向二維碼添加數據
qr.make(fit=True)
img = qr.make_image(fill_color="green", back_color="white")#更改QR的背景和繪畫顏色
img.show()# 顯示二維碼/<code>

生成二維碼後,可以得到下面的二維碼,如下左圖。用手機掃描可以看到如下右圖。

二維碼的生成與識別,Python可以這樣做

  二、二維碼的識別

1、安裝opencv和pyzbar兩個模塊

<code>pip install opencv-python
pip install pyzbar/<code>
<code>import cv2 as cv
from pyzbar import pyzbar as pyzbar

def decodeDisplay(image):
barcodes = pyzbar.decode(image)
for barcode in barcodes:
# 提取二維碼的邊界框的位置
# 畫出圖像中條形碼的邊界框
(x, y, w, h) = barcode.rect
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

# 提取二維碼數據為字節對象,所以如果我們想在輸出圖像上
# 畫出來,就需要先將它轉換成字符串
barcodeData = barcode.data.decode("UTF8")
barcodeType = barcode.type

# 繪出圖像上條形碼的數據和條形碼類型
text = "{} ({})".format(barcodeData, barcodeType)
cv.putText(image, text, (x, y - 10), cv.FONT_HERSHEY_SIMPLEX,.5, (0, 0, 125), 2)
# 向終端打印條形碼數據和條形碼類型
print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
return image

def detect():
camera = cv.VideoCapture(0)
while True:
# 讀取當前幀

ret, frame = camera.read()
# 轉為灰度圖像
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
im = decodeDisplay(gray)
c=cv.waitKey(5)#等待5毫秒
cv.imshow("camera", im)
if(c==27):#按下esc鍵關閉攝像頭窗口
camera.release()
cv.destroyAllWindows()
break

if __name__ == '__main__':
detect()/<code>

在電腦上測試時,我啟用了電腦自帶攝像頭,如下圖,攝像頭掃描手機提示的二維碼,獲取信息在後面編程界面顯示。

二維碼的生成與識別,Python可以這樣做

  到此,在python中實現二維碼的生成和識別,已經完成,你也快去試試吧!


分享到:


相關文章: