Python解析二維碼、條形碼

**轉載請註明轉自:https://leejason.blog.csdn.net/article/details/106469141**

瞭解Python解析二維碼之前,可以先看下之前寫的一篇關於Python製作二維碼的博文:用python製作二維碼

1 前言

  相信大家如果看完了Python製作二維碼之後,對於製作一些純文字、帶背景、帶動態圖的二維碼都沒有很大的問題,想知道二維碼中蘊含什麼信息的話,手機掃一下也就出來了,但是,對於一些複雜的二維嗎,比如下面的QQ登錄、微信登錄的二維碼,你就不想知道這些個二維碼中包含哪些信息嗎?(下面二維碼已過期,可放心掃描)
在這裏插入圖片描述
在這裏插入圖片描述

2 二維碼知識小科普

  稍微小科普一下,不要嫌囉嗦(小聲逼逼)。科普部分主要來自百度百科深度解析二維碼

2.1 什麼是二維碼

  日常生活中常見的二維碼,但是你可能並不能正確的說出它的定義,其實二維碼又稱二維條碼,常見的二維碼爲QR Code,QR全稱Quick Response,是一個近幾年來移動設備上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的信息,也能表示更多的數據類型。QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)。它是在一個矩形空間通過黑、白像素在矩陣中的不同分佈進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其他形狀)的出現表示二進制“1”,點的不出現表示二進制的“0”,點的排列組合確定了矩陣式二維條碼所代表的意義。

2.2 二維碼的結構

  根據標準(ISO/IEC 18004),我們可以瞭解到 QR 碼結構如下:
在這裏插入圖片描述

  1. 功能圖形
      功能圖形是不參與編碼數據的區域。它包含空白區、位置探測圖形、位置探測圖形分隔符、定位圖形、校正圖形五大模塊。
    空白區:空白區顧名思義就是要留空白。因此,這裏不能有任何圖樣或標記。這樣才能保證 QR 能被識別。
      位置探測圖形:這個有點類似中文的“回”字。在 QR 碼中有個這樣的標識,它分別的左上、右上和左下角。作用是協助掃描軟件定位 QR 碼並轉換座標系。我們在掃描二維碼的時候,不管是豎着掃、橫着掃、斜着掃都能識別出內容,主要是它的功勞。
      位置探測圖形分隔符:主要作用是區分功能圖形和編碼區域。
      定位圖形:它由黑白間隔的各自各自組成的線條。主要用於指示標識密度和確定座標系。原因是 QR 碼一種有 40 個版本,也就是說有 40 種尺寸。每種二維碼的尺寸越大,掃描的距離就越遠。
      校正圖形:只有 Version 2 及以上的QR碼有校正標識。校正標識用於進一步校正座標系。

  2. 編碼區域
      編碼區域是數據進行編碼存儲的區域。它由格式信息、版本信息、數據和糾錯碼字三部分構成。
      格式信息:所有尺寸的二維碼都有該信息。它存放一些格式化數據的信息,例如容錯級別、數據掩碼,和額外的自身 BCH 容錯碼。
      版本信息:版本信息是規定二維碼的規格。前面講到 QR 碼一共有 40 種規格的矩陣(一般爲黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本 每邊增加4個模塊。
      數據和糾錯碼:主要是存儲實際數據以及用於糾錯碼字。

2.3 二維碼的繪製過程

1)在二維碼的左上角、左下角、右上角繪製位置探測圖形。位置探測圖形一定是一個 7x7 的矩陣。
2)繪製校正圖形。校正圖形一定是一個 5x5 的矩陣。
3)繪製兩條連接三個位置探測圖形的定位圖形。
4)在上述圖片的基礎上,繼續繪製格式信息。
5)接着繪製版本信息。
6)填充數據碼和糾錯碼到二維碼圖中。
7)最後是繪製蒙版圖案。因爲按照上述方式填充內容,可能會出現大面積的空白或黑塊的情況,導致掃描識別會十分困難。所以需要對整個圖像與蒙版進行蒙版操作(Masking),蒙版操作即爲異或 XOR 操作。在這一步,我們可以將數據排列成各種圖片。

3 Python解析二維碼

3.1 準備工作:

先安裝一下需要的Python庫:

import os#系統庫,判斷是本地二維碼文件還是網絡二維碼
import cv2 as cv#讀取圖片的庫
import requests#下載網站二維碼
from pyzbar.pyzbar import decode#解析二維碼的庫
import zxing#解析二維碼的庫

先製作一張簡易二維碼:

from MyQR import myqr
#製作簡單文字二維碼
ver,level,qr_name = myqr.run(words="Test123")
print(ver,level,qr_name)

另外網站二維碼取剛剛博客的第一張二維碼圖片:https://img-blog.csdnimg.cn/20200601231955597.png

3.2 pyzbar庫解析二維碼

代碼:

# 解析方法一:藉助pyzbar
def pyzbarParseQRCode(filePath):
    if os.path.isfile(filePath):# 判斷是否是本地文件
        img = cv.imread(filePath)#讀取二維碼圖片
    else:# 解析網站驗證碼
        with open("./qrCodeTest.png","wb") as f:#下載圖片保存到本地
            f.write(requests.get(url=filePath).content)
        img = cv.imread("./qrCodeTest.png")#讀取圖片
    texts = decode(img)#解碼驗證碼圖片
    for text in texts:#遍歷解碼數據
        qrInfo = text.data.decode("utf-8")#將內容解碼成指定格式
        print(qrInfo)#打印
if __name__ == '__main__':
    ##本地驗證碼
    # filePath = "./qrcode.png"
    ##網站驗證碼
    filePath = "https://img-blog.csdnimg.cn/20200114150746810.png"
    pyzbarParseQRCode(filePath)

效果:
本地驗證碼解析結果:
在這裏插入圖片描述
網站驗證碼解析結果:
在這裏插入圖片描述

3.3 zxing庫解析二維碼

#解析方法二:藉助zxing識別
def zxingParseQRCode(filePath):
    reader = zxing.BarCodeReader()
    if os.path.isfile(filePath):
        barcode = reader.decode(filePath)
    else:
        with open("./qrCodeTest.png","wb") as f:
            f.write(requests.get(url=filePath).content)
        barcode = reader.decode("./qrCodeTest.png")

    print(barcode.parsed)
if __name__ == '__main__':
    ##本地驗證碼
    filePath = "./barCode.jpg"
    ##網絡驗證碼
    # filePath = "https://img-blog.csdnimg.cn/20200114150746810.png"
    zxingParseQRCode(filePath)

效果和上面方法一樣,就不放圖片了。

3.4 回頭看看微信,QQ登錄二維碼解析結果

微信登錄二維碼解析結果:
在這裏插入圖片描述
QQ登錄騰訊視頻二維碼解析結果:
在這裏插入圖片描述
實際解析出來的鏈接是沒有任何意義的,因爲驗證碼過期之後,這個鏈接要麼失效要麼就是跳轉到相應下載鏈接去。

3.5 解析條形碼

條形碼圖片:
在這裏插入圖片描述
猜猜解析出來會是什麼呢?

def pyzbarParseQRCode(filePath):
    if os.path.isfile(filePath):
        img = cv.imread(filePath)
    else:
        with open("./qrCodeTest.png","wb") as f:
            f.write(requests.get(url=filePath).content)
        img = cv.imread("./qrCodeTest.png")
    texts = decode(img)
    for text in texts:
        qrInfo = text.data.decode("utf-8")
        print(qrInfo)
if __name__ == '__main__':
    filePath = "./barCode.jpg"
    pyzbarParseQRCode(filePath)

結果:

在這裏插入圖片描述
兩者是一樣的
在這裏插入圖片描述
當然條形碼還可以包含其他信息,這裏只是最簡單的信息嘛.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章