Python實現掃碼工具

Python實現掃碼工具

二維碼做爲一種信息傳遞的工具,在當今社會發揮了重要做用。從手機用戶登陸到手機支付,生活的各個角落都能看到二維碼的存在。那你知道二維碼是怎麼解析的嗎?有想過本身實現一個掃碼工具嗎?若是想的話就繼續看下去吧!python

1、案例分析

咱們先思考一下,實現掃碼工具須要寫什麼操做。在掃碼過程當中咱們須要打開攝像頭,如何由手機或者電腦識別二維碼。因此咱們要實現兩個關鍵的步驟:調用攝像頭、識別二維碼。bash

這兩個操做分別對應了兩個模塊,它們就是opencv和pyzbar,其中opencv是英特爾的計算機視覺處理模塊,而pyzbar則是用於解析二維碼的模塊。markdown

2、環境

環境包括python環境和模塊。個人環境以下:ide

系統:Windows 10
python:python 3.7.9
opencv:opencv-python-4.4.0.44
pyzbar:pyzbar-0.1.8
複製代碼

模塊安裝很簡單,咱們直接用pip安裝,先安裝opencv模塊:函數

pip install opencv-python
複製代碼

而後是pyzbar模塊:工具

pip install pyzbar
複製代碼

在未指定安裝版本時,系統會自動安裝最新版。安裝好模塊後,咱們就能夠來實現掃碼工具了。ui

3、識別二維碼

有了pyzbar模塊後,咱們識別二維碼的工做就很是簡單了,首先須要準備一張二維碼。有了二維碼後就能夠開始解析了,具體步驟以下:url

  1. 讀取二維碼圖片
  2. 解析二維碼中的數據
  3. 在解析出的數據中提取data信息

實現代碼以下:spa

import cv2
from pyzbar import pyzbar
# 一、讀取二維碼圖片
qrcode = cv2.imread('qrcode.jpg')
# 二、解析二維碼中的數據
data = pyzbar.decode(qrcode)
print(data)
# 三、在數據中解析出二維碼的data信息
text = data[0].data.decode('utf-8')
print(text)
複製代碼

在上面咱們解析了兩次,第一次獲取了一個data,咱們先來看看data長什麼樣子:code

[Decoded(data=b'http://weixin.qq.com/r/vC_fhynEKnRVrW3k93qu', type='QRCODE', rect=Rect(left=140, top=113, width=390, height=390), polygon=[Point(x=140, y=113), Point(x=140, y=503), Point(x=530, y=503), Point(x=530, y=113)])]
複製代碼

能夠看到是一個列表,並且列表的第一個數據包含url的信息。因此咱們須要經過下面的代碼再次解析:

text = data[0].data.decode('utf-8')
複製代碼

這樣咱們就能拿到二維碼中包含的信息了。爲了方便後續使用,能夠將上面的代碼寫成一個函數:

def scan_qrcode(img_path):
    qrcode = cv2.imread(img_path)
    data = pyzbar.decode(qrcode)
    return data[0].data.decode('utf-8')
複製代碼

接下來咱們再看看如何調用攝像頭。

4、調用攝像頭

在opencv中提供了一個VideoCapture類用於讀取視頻,一樣能夠用來調用攝像頭。調用攝像頭的步驟以下:

  1. 調用攝像頭
  2. 循環
  3. 在循環內讀取一幀畫面
  4. 顯示當前讀取的畫面
  5. 等待鍵盤輸入
  6. 判斷是否按退出鍵q
  7. 按了推出鍵則退出,沒按則繼續循環

具體代碼以下:

import cv2
# 調用攝像頭
cap = cv2.VideoCapture(0)
while True:
    # 讀取一幀畫面
    ret, frame = cap.read()
    # 顯示當前幀
    cv2.imshow('scan qrcode', frame)
    # 等待鍵盤輸入
    key = cv2.waitKey(10)
    # 當按下q鍵時關閉攝像頭
    if key == ord('q'):
        break
# 銷燬全部窗口
cv2.destroyAllWindows()
複製代碼

大家能夠本身嘗試運行一下上面的代碼,效果就像是打開了本身的前置攝像頭。

如今調用了攝像頭,咱們能夠把兩部分的代碼結合起來。

5、實現掃碼工具

咱們掃碼工具的主體部分是調用攝像頭的操做,咱們須要對讀取到的每一幀畫面進行解析,當解析出結果後輸出並退出。具體代碼以下:

import cv2
from pyzbar import pyzbar

def scan_qrcode(qrcode):
    data = pyzbar.decode(qrcode)
    return data[0].data.decode('utf-8')

cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    cv2.imshow('scan qrcode', frame)

    # 解析二維碼
    text = None
    try:
        text = scan_qrcode(frame)
    except Exception as e:
        pass
    if text:
        print(text)
        break

    key = cv2.waitKey(10)
    if key == ord('q'):
        break
cv2.destroyAllWindows()
複製代碼

上面咱們把scan_qrcode函數修改了一下,從原來的傳入圖片路徑到直接傳入圖片對象。由於經過VideoCapture對象獲取的圖片幀和經過cv2.imread獲取的圖片是同一數據類型。

上面關鍵步驟在解析二維碼的操做。首先定義一個text,由於解析過程當中若是沒有二維碼會出現異常,因此用try-except語句處理。如何經過if判斷text的內容,只有當咱們真正解析到了數據,程序纔會輸出結果,並退出程序。

到這裏,咱們就實現了掃碼工具。感興趣的讀者能夠關注個人公衆號「新建文件夾X」。

相關文章
相關標籤/搜索