Python實(shí)現(xiàn)的掃碼工具居然這么好用!
一、案例分析
我們先思考一下,實(shí)現(xiàn)掃碼工具需要寫什么操作。在掃碼過(guò)程中我們需要打開(kāi)攝像頭,如何由手機(jī)或者電腦識(shí)別二維碼。所以我們要實(shí)現(xiàn)兩個(gè)關(guān)鍵的步驟:調(diào)用攝像頭、識(shí)別二維碼。
這兩個(gè)操作分別對(duì)應(yīng)了兩個(gè)模塊,它們就是opencv
和pyzbar
,其中opencv
是英特爾的計(jì)算機(jī)視覺(jué)處理模塊,而pyzbar則是用于解析二維碼的模塊。
二、環(huán)境
環(huán)境包括python
環(huán)境和模塊。我的環(huán)境如下:
系統(tǒng):Windows 10 python:python 3.7.9 opencv:opencv-python-4.4.0.44 pyzbar:pyzbar-0.1.8
模塊安裝很簡(jiǎn)單,我們直接用pip
安裝,先安裝opencv
模塊:
pip install opencv-python
然后是pyzbar
模塊:
pip install pyzbar
在未指定安裝版本時(shí),系統(tǒng)會(huì)自動(dòng)安裝最新版。安裝好模塊后,我們就可以來(lái)實(shí)現(xiàn)掃碼工具了。
三、識(shí)別二維碼
有了pyzbar模塊后,我們識(shí)別二維碼的工作就非常簡(jiǎn)單了,首先需要準(zhǔn)備一張二維碼。有了二維碼后就可以開(kāi)始解析了,具體步驟如下:
1.讀取二維碼圖片
2.解析二維碼中的數(shù)據(jù)
3.在解析出的數(shù)據(jù)中提取data信息
實(shí)現(xiàn)代碼如下:
import cv2 from pyzbar import pyzbar # 1、讀取二維碼圖片 qrcode = cv2.imread('qrcode.jpg') # 2、解析二維碼中的數(shù)據(jù) data = pyzbar.decode(qrcode) print(data) # 3、在數(shù)據(jù)中解析出二維碼的data信息 text = data[0].data.decode('utf-8') print(text)
在上面我們解析了兩次,第一次獲取了一個(gè)data
,我們先來(lái)看看data
長(zhǎng)什么樣子:
[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)])]
可以看到是一個(gè)列表,而且列表的第一個(gè)數(shù)據(jù)包含url
的信息。所以我們需要通過(guò)下面的代碼再次解析:
text = data[0].data.decode('utf-8')
這樣我們就能拿到二維碼中包含的信息了。為了方便后續(xù)使用,可以將上面的代碼寫成一個(gè)函數(shù):
def scan_qrcode(img_path): qrcode = cv2.imread(img_path) data = pyzbar.decode(qrcode) return data[0].data.decode('utf-8')
接下來(lái)我們?cè)倏纯慈绾握{(diào)用攝像頭。
四、調(diào)用攝像頭
在opencv
中提供了一個(gè)VideoCapture
類用于讀取視頻,同樣可以用來(lái)調(diào)用攝像頭。調(diào)用攝像頭的步驟如下:
1.調(diào)用攝像頭
2.循環(huán)
3.在循環(huán)內(nèi)讀取一幀畫面
4.顯示當(dāng)前讀取的畫面
5.等待鍵盤輸入
6.判斷是否按退出鍵q
7.按了推出鍵則退出,沒(méi)按則繼續(xù)循環(huán)
具體代碼如下:
import cv2 # 調(diào)用攝像頭 cap = cv2.VideoCapture(0) while True: # 讀取一幀畫面 ret, frame = cap.read() # 顯示當(dāng)前幀 cv2.imshow('scan qrcode', frame) # 等待鍵盤輸入 key = cv2.waitKey(10) # 當(dāng)按下q鍵時(shí)關(guān)閉攝像頭 if key == ord('q'): break # 銷毀所有窗口 cv2.destroyAllWindows()
你們可以自己嘗試運(yùn)行一下上面的代碼,效果就像是打開(kāi)了自己的前置攝像頭。
現(xiàn)在調(diào)用了攝像頭,我們可以把兩部分的代碼結(jié)合起來(lái)。
五、實(shí)現(xiàn)掃碼工具
我們掃碼工具的主體部分是調(diào)用攝像頭的操作,我們需要對(duì)讀取到的每一幀畫面進(jìn)行解析,當(dāng)解析出結(jié)果后輸出并退出。具體代碼如下:
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
函數(shù)修改了一下,從原來(lái)的傳入圖片路徑到直接傳入圖片對(duì)象。因?yàn)橥ㄟ^(guò)VideoCapture
對(duì)象獲取的圖片幀和通過(guò)cv2.imread
獲取的圖片是同一數(shù)據(jù)類型。
上面關(guān)鍵步驟在解析二維碼的操作。首先定義一個(gè)text
,因?yàn)榻馕鲞^(guò)程中如果沒(méi)有二維碼會(huì)出現(xiàn)異常,所以用語(yǔ)句處理。如何通過(guò)if判斷text
的內(nèi)容,只有當(dāng)我們真正解析到了數(shù)據(jù),程序才會(huì)輸出結(jié)果,并退出程序。
到這里,我們就實(shí)現(xiàn)了掃碼工具。
到此這篇關(guān)于Python實(shí)現(xiàn)的掃碼工具居然這么好用!的文章就介紹到這了,更多相關(guān)Python掃碼工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch建立mobilenetV3-ssd網(wǎng)絡(luò)并進(jìn)行訓(xùn)練與預(yù)測(cè)方式
這篇文章主要介紹了pytorch建立mobilenetV3-ssd網(wǎng)絡(luò)并進(jìn)行訓(xùn)練與預(yù)測(cè)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python中用于轉(zhuǎn)換字母為小寫的lower()方法使用簡(jiǎn)介
這篇文章主要介紹了Python中用于轉(zhuǎn)換字母為小寫的lower()方法使用,是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05pandas庫(kù)之DataFrame滑動(dòng)窗口的實(shí)現(xiàn)
本文主要介紹了pandas庫(kù)之DataFrame滑動(dòng)窗口的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python密碼學(xué)周期置換密碼學(xué)習(xí)
這篇文章主要為大家介紹了python密碼學(xué)周期置換密碼的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python實(shí)現(xiàn)的多線程端口掃描功能示例
這篇文章主要介紹了python實(shí)現(xiàn)的多線程端口掃描功能,結(jié)合實(shí)例形式分析了Python基于socket的端口掃描具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-01-01使用Python將Exception異常錯(cuò)誤堆棧信息寫入日志文件
這篇文章主要介紹了使用Python將Exception異常錯(cuò)誤堆棧信息寫入日志文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python+Pika+RabbitMQ環(huán)境部署及實(shí)現(xiàn)工作隊(duì)列的實(shí)例教程
RabbitMQ是一個(gè)消息隊(duì)列服務(wù)器,在本文中我們將學(xué)習(xí)到Python+Pika+RabbitMQ環(huán)境部署及實(shí)現(xiàn)工作隊(duì)列的實(shí)例教程,需要的朋友可以參考下2016-06-06