1. Python實(shí)現(xiàn)掃碼工具

        共 2724字,需瀏覽 6分鐘

         ·

        2021-04-30 08:19


        大家好,歡迎來到 Crossin的編程教室 !

        二維碼作為一種信息傳遞的工具,在當(dāng)今社會(huì)發(fā)揮了重要作用。從手機(jī)用戶登錄到手機(jī)支付,生活的各個(gè)角落都能看到二維碼的存在。那你知道二維碼是怎么解析的嗎?有想過自己實(shí)現(xiàn)一個(gè)掃碼工具嗎?今天我們就來給大家實(shí)例演示一下。

        一、案例分析

        我們先思考一下,實(shí)現(xiàn)掃碼工具需要寫什么操作。在掃碼過程中我們需要打開攝像頭,如何由手機(jī)或者電腦識(shí)別二維碼。所以我們要實(shí)現(xiàn)兩個(gè)關(guān)鍵的步驟:①調(diào)用攝像頭,②識(shí)別二維碼。

        這兩個(gè)操作分別對應(yīng)了兩個(gè)模塊,它們就是opencvpyzbar,其中opencv是英特爾的計(jì)算機(jī)視覺處理模塊,而pyzbar則是用于解析二維碼的模塊。

        二、環(huán)境

        環(huán)境包括python環(huán)境和模塊。我的環(huán)境如下:

        系統(tǒng):Windows 10python:python 3.7.9opencv:opencv-python-4.4.0.44pyzbar:pyzbar-0.1.8

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

        pip install opencv-python

        然后是pyzbar模塊:

        pip install pyzbar

        在未指定安裝版本時(shí),系統(tǒng)會(huì)自動(dòng)安裝最新版。安裝好模塊后,我們就可以來實(shí)現(xiàn)掃碼工具了。


        三、識(shí)別二維碼

        有了pyzbar模塊后,我們識(shí)別二維碼的工作就非常簡單了,首先需要準(zhǔn)備一張二維碼。有了二維碼后就可以開始解析了,具體步驟如下:

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

        實(shí)現(xiàn)代碼如下:

        import cv2from 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,我們先來看看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)])]

        可以看到是一個(gè)列表,而且列表的第一個(gè)數(shù)據(jù)包含url的信息。所以我們需要通過下面的代碼再次解析:

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

        接下來我們再看看如何調(diào)用攝像頭。


        四、調(diào)用攝像頭

        在opencv中提供了一個(gè)VideoCapture類用于讀取視頻,同樣可以用來調(diào)用攝像頭。調(diào)用攝像頭的步驟如下:

        1.調(diào)用攝像頭2.循環(huán)3.在循環(huán)內(nèi)讀取一幀畫面4.顯示當(dāng)前讀取的畫面5.等待鍵盤輸入6.判斷是否按退出鍵q7.按了退出鍵則退出,沒按則繼續(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)行一下上面的代碼,效果就像是打開了自己的前置攝像頭。

        現(xiàn)在調(diào)用了攝像頭,我們可以把兩部分的代碼結(jié)合起來。

        五、實(shí)現(xiàn)掃碼工具

        我們掃碼工具的主體部分是調(diào)用攝像頭的操作,我們需要對讀取到的每一幀畫面進(jìn)行解析,當(dāng)解析出結(jié)果后輸出并退出。具體代碼如下:

        import cv2from 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'): breakcv2.destroyAllWindows()

        上面我們把scan_qrcode函數(shù)修改了一下,從原來的傳入圖片路徑到直接傳入圖片對象。因?yàn)橥ㄟ^VideoCapture對象獲取的圖片幀和通過cv2.imread獲取的圖片是同一數(shù)據(jù)類型。

        上面關(guān)鍵步驟在解析二維碼的操作。首先定義一個(gè)text,因?yàn)榻馕鲞^程中如果沒有二維碼會(huì)出現(xiàn)異常,所以用try-except語句處理。如何通過if判斷text的內(nèi)容,只有當(dāng)我們真正解析到了數(shù)據(jù),程序才會(huì)輸出結(jié)果,并退出程序。

        到這里,我們就實(shí)現(xiàn)了掃碼工具。

        如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點(diǎn)贊/收藏~

        作者:ZackSock來源:新建文件夾X

        _往期文章推薦_

        一行代碼制作個(gè)性化二維碼




        如需了解付費(fèi)精品課程教學(xué)答疑服務(wù)請?jiān)?strong>Crossin的編程教室內(nèi)回復(fù): 666

        瀏覽 45
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 黄视频在线| 熟女操逼在线 | 熟女吊钟嗷嗷叫91 | 中文偷拍网 | 日韩人妻精品无码 |