1. 程式人生 > 程式設計 >Python實現掃碼工具的示例程式碼

Python實現掃碼工具的示例程式碼

二維碼作為一種資訊傳遞的工具,在當今社會發揮了重要作用。從手機使用者登入到手機支付,生活的各個角落都能看到二維碼的存在。那你知道二維碼是怎麼解析的嗎?有想過自己實現一個掃碼工具嗎?如果想的話就繼續看下去吧!

一、案例分析

我們先思考一下,實現掃碼工具需要寫什麼操作。在掃碼過程中我們需要開啟攝像頭,如何由手機或者電腦識別二維碼。所以我們要實現兩個關鍵的步驟:呼叫攝像頭、識別二維碼。

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

二、環境

環境包括python環境和模組。我的環境如下:

系統: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

在未指定安裝版本時,系統會自動安裝最新版。安裝好模組後,我們就可以來實現掃碼工具了。

三、識別二維碼

有了pyzbar模組後,我們識別二維碼的工作就非常簡單了,首先需要準備一張二維碼。有了二維碼後就可以開始解析了,具體步驟如下:

  • 讀取二維碼圖片
  • 解析二維碼中的資料
  • 在解析出的資料中提取data資訊

實現程式碼如下:

import cv2
from pyzbar import pyzbar
# 1、讀取二維碼圖片
qrcode = cv2.imread('qrcode.jpg')
# 2、解析二維碼中的資料
data = pyzbar.decode(qrcode)
print(data)
# 3、在資料中解析出二維碼的data資訊
text = data[0].data.decode('utf-8')
print(text)

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

[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=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')

接下來我們再看看如何呼叫攝像頭。

四、呼叫攝像頭

在opencv中提供了一個VideoCapture類用於讀取視訊,同樣可以用來呼叫攝像頭。呼叫攝像頭的步驟如下:

  • 呼叫攝像頭
  • 迴圈
  • 在迴圈內讀取一幀畫面
  • 顯示當前讀取的畫面
  • 等待鍵盤輸入
  • 判斷是否按退出鍵q
  • 按了推出鍵則退出,沒按則繼續迴圈

具體程式碼如下:

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()

你們可以自己嘗試執行一下上面的程式碼,效果就像是打開了自己的前置攝像頭。

現在呼叫了攝像頭,我們可以把兩部分的程式碼結合起來。

五、實現掃碼工具

我們掃碼工具的主體部分是呼叫攝像頭的操作,我們需要對讀取到的每一幀畫面進行解析,當解析出結果後輸出並退出。具體程式碼如下:

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的內容,只有當我們真正解析到了資料,程式才會輸出結果,並退出程式。

到此這篇關於Python實現掃碼工具的文章就介紹到這了,更多相關python掃碼工具內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!