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模塊後,我們識別二維碼的工作就非常簡單瞭,首先需要準備一張二維碼。有瞭二維碼後就可以開始解析瞭,具體步驟如下:
1.讀取二維碼圖片
2.解析二維碼中的數據
3.在解析出的數據中提取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
類用於讀取視頻,同樣可以用來調用攝像頭。調用攝像頭的步驟如下:
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()
你們可以自己嘗試運行一下上面的代碼,效果就像是打開瞭自己的前置攝像頭。
現在調用瞭攝像頭,我們可以把兩部分的代碼結合起來。
五、實現掃碼工具
我們掃碼工具的主體部分是調用攝像頭的操作,我們需要對讀取到的每一幀畫面進行解析,當解析出結果後輸出並退出。具體代碼如下:
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
,因為解析過程中如果沒有二維碼會出現異常,所以用語句處理。如何通過if判斷text
的內容,隻有當我們真正解析到瞭數據,程序才會輸出結果,並退出程序。
到這裡,我們就實現瞭掃碼工具。
到此這篇關於Python實現的掃碼工具居然這麼好用!的文章就介紹到這瞭,更多相關Python掃碼工具內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- opencv-python圖像處理安裝與基本操作方法
- python中掃描條形碼和二維碼的實現代碼
- 如何用Python生成二維碼、解析二維碼
- OpenCV半小時掌握基本操作之圖像基礎操作
- python通過opencv調用攝像頭操作實例分析