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=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的內容,只有當我們真正決議到了資料,程式才會輸出結果,并退出程式,
到這里,我們就實作了掃碼工具,感興趣的讀者可以關注我的公眾號“禿頭三劍客”,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/150954.html
標籤:其他
