使用python玩轉二維碼!速學速用!⛵

ShowMeAI 發表於 2022-12-01
Python
使用python玩轉二維碼!速學速用!⛵

💡 作者:韓信子@ShowMeAI
📘 Python3◉技能提升系列https://www.showmeai.tech/tutorials/56
📘 本文地址https://showmeai.tech/article-detail/398
📢 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
📢 收藏ShowMeAI檢視更多精彩內容

使用python玩轉二維碼!速學速用!⛵

二維碼用某種特定的幾何圖形來記錄資料符號資訊,這些黑白相間的圖形按照一定的規律分佈在平面上(二維方向)。二維碼是目前最常使用的快捷資訊儲存方式之一,微信等都可以透過這項技術實現快掃快用。

在本篇內容中,ShowMeAI帶大家來學習二維碼的應用技能,包括構建二維碼解碼二維碼

💡 二維碼歷史

QR(Quick Response,快速響應)Code 誕生於 1994 年的日本汽車公司 Denso Wave,是一種二維條形碼,由在白色背景上排列成方形網格的黑色方塊組成,允許立即訪問隱藏在程式碼中的資訊。

使用python玩轉二維碼!速學速用!⛵

QR碼(也就是我們常說的二維碼)可儲存 7000 多個字元,由相機等裝置讀取,並從畫素影像中解析出包含的資訊,讀取速度比其他條碼快得多。

💡 二維碼應用場景

生成和讀取二維碼的簡便性導致它們在零售店、銀行、醫院、旅遊和食品服務行業的產品包裝、非接觸式商務、訂單處理、結帳和支付服務中得到廣泛採用。我們常用到通訊軟體、社交平臺都幾乎都可以透過二維碼來掃碼識別。

2020 年 9 月對美國和英國消費者進行的一項調查發現,在COVID-19大流行期間二維碼的使用有所增加。

使用python玩轉二維碼!速學速用!⛵

💡 生成二維碼

我們先安裝和匯入本次需要用到的 Python 工具庫qrcode,它可以很方便地建立和讀取二維碼。

import qrcode

建立資料。

data="https://www.showmeai.tech"

建立二維碼例項。

qr= qrcode.QRCode(version=1, box_size=10, border=4, error_correction=qrcode.constants.ERROR_CORRECT_H)
使用python玩轉二維碼!速學速用!⛵

我們對引數做一個解釋:

  • version引數是一個從 1 到 40 的整數,控制二維碼的大小;最小的是版本 1,它是一個 21x21 矩陣。
  • box_size引數控制二維碼每個方框的畫素數。
  • border控制框邊框的粗細。
  • error_correction控制用於 QR 碼的糾錯,特別是當 QR 碼因錯誤而無法讀取時。選項 error_correction包括:
    • ERROR_CORRECT_L:可以糾正大約 7% 或更少的錯誤
    • ERROR_CORRECT_M(預設):可以糾正大約 15% 或更少的錯誤。
    • ERROR_CORRECT_Q:可以糾正大約 25% 或更少的錯誤。
    • ERROR_CORRECT_H:可以糾正大約 30% 或更少的錯誤。
qr.add_data(data)
qr.make(fit=True)

最後,使用生成二維碼make_image()將 QRCode 物件轉換為影像檔案並儲存在檔案中。

qr_img=qr.make_image(fill_color="black", back_color="white")
qr_img.save("qr.jpg")

其中,fill_colorback_color可以改變二維碼的背景和繪畫顏色。

💡 閱讀二維碼

本篇我們將講解兩種不同的方式來讀取二維碼,使用cv2pyzbar

💦 opencv 讀取解碼

匯入庫。

import cv2

開啟上方儲存的qr.jpg影像檔案。

cv_img= cv2.imread("qr.jpg")

在 CV2 中建立類 QRCodeDetector 的物件。

qr_detect= cv2.QRCodeDetector()
data, bbox, st_qrcode= qr_detect.detectAndDecode(cv_img)

detectAndDecode()檢測並解碼影像中存在的二維碼。該方法返回以下內容:

  • 解碼後的資料,如果沒有找到二維碼,則資料為空。
  • 包含檢測到的二維碼頂點的邊界框。
  • 可選的包含經過校正和二值化的 QR 碼的輸出影像。
print(f"QRCode data:\n{data}")
使用python玩轉二維碼!速學速用!⛵

💦 pyzbar 讀取解碼

使用 cv2 讀取影像。

import cv2
from pyzbar.pyzbar import decode
# read the image using cv2
img = cv2.imread("qr.jpg")

接下來,找到影像中的條形碼和二維碼。

# Decode the barcode and QR Code in the image
detectedBarcodes = decode(img)

decode會遍歷影像中所有檢測到的條形碼。返回結果陣列的每個元素代表一個檢測到的條形碼,可以讀取影像中的多個條形碼或 QR 碼。

每個檢測到的條碼包含以下資訊:

  • data:條形碼/二維碼中嵌入的資料。
  • type:它是條碼型別,如 QR Code、EAN-13、UPC-A、UPC-E、EAN-8、Code 128 和 Code 39 符號體系。
  • rect:定位框的邊界點集合。對於QR碼,它是對應QR碼四邊形的四個角的四個點的列表。
  • polygon:檢索位置多邊形中的點數。位置多邊形定義影像中條形碼被解碼的區域。
  • quality:質量。
  • orientation:表示條碼的方向。
# read the image in numpy array using cv2
img = cv2.imread("qr.jpg")# Decode the barcode image
detectedBarcodes = decode(img)# If barcode is not detected then print the message
if not detectedBarcodes:
    print("Bar code not detected or your barcode is blank or corrupted!")
else:# Iterate through all the detected barcodes in image
    for bar_code in detectedBarcodes:# Locate the barcode position in image using rect
        (x, y, w, h) = bar_code.rect# Highlight the rectanngela round the bar code
        cv2.rectangle(img, (x-10, y-10),
                      (x + w+10, y + h+10),
                      (255, 0, 0), 2)if bar_code.data!="":# Print the barcode data
            print(f"Data :  {bar_code.data.decode('UTF-8')}")
            print(f"Bar Code Type: {bar_code.type}")
            print(f"Bar Code Orientation: {bar_code.orientation}")
使用python玩轉二維碼!速學速用!⛵

參考資料

推薦閱讀

使用python玩轉二維碼!速學速用!⛵