天天看點

OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

目錄

過程

1、擷取圖檔中的二維碼資訊

2、擷取視訊中的二維碼資訊

3、檢測出二維碼框

4、顯示資料

5、添加資料,判斷二維碼是否授權

5-1:、添加資料

5-2、讀取檔案資訊,放入數組

5-3、判斷二維碼是否授權

總代碼

過程

1、擷取圖檔中的二維碼資訊

# 檢測圖像中的碼(解碼)
def Read_Decode_Pic():
    img = cv2.imread('Resource/qrcode.jpg')
    # 周遊解碼
    for code in decode(img):
        print("條形碼/二維碼:", code)
        print("條形碼/二維碼資料:", code.data.decode('utf-8'))    #解碼資料
           

注:要解碼資料的話,必須在for循環中進行,不能直接指派 

二維碼: 

OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

 條形碼:

OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

2、擷取視訊中的二維碼資訊

# 檢測視訊中的碼(解碼)
def Read_Decode_Cam():
    cap = cv2.VideoCapture(0)               #打開視訊

    while True:
        success, img = cap.read()           #擷取每一幀圖檔
        for code in decode(img):            #解碼
            print("條形碼/二維碼:", code)    #解碼内容
            print("條形碼/二維碼資料:", code.data.decode('utf-8'))  # 解碼資料

        cv2.imshow('result', img)           #逐像素顯示,不斷更替,相當于視訊
        cv2.waitKey(1)                      #延時1ms
           
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

3、檢測出二維碼框

如果是矩形框的話,比較友善,但是旋轉情況下,會不準确。因為rect擷取的是正的矩形,無法旋轉。

# 畫出矩形
pts = code.rect                             #得到矩形四個角
cv2.rectangle(image, pts, (255,0,255), 3)   #畫出矩形
           
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

 是以我們需要擷取多邊形對它進行旋轉:

注:polylines函數中需要的坐标類型是是CV_32S,是以需要轉換一下

# 多邊形擷取(矩形的框)
        pts = np.array(code.polygon, np.int32)          #擷取多邊形坐标
        cv2.polylines(image, [pts], True, (0,0,255), 5) #畫多邊形框
           
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

 可以發現,這時我們可以檢測到旋轉的矩形框。

4、顯示資料

擷取矩形框的左上角作為Text的坐标(左邊坐标),顯示資料 

# 顯示資料
        pts_rect = code.rect
        print(pts_rect)
        cv2.putText(image, data, (pts_rect[0],pts_rect[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,0,0), 2)
        #                  顯示資料  矩形坐标                   字型類型                 字型大小 顔色     粗細
           
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

5、添加資料,判斷二維碼是否授權

         建立一個檔案,裡面放入一些二維碼資料庫,讀取檔案,判斷二維碼的資料是否在資料庫裡面。(不在則紅色,表示未授權;在則綠色,表示已授權)

5-1:、添加資料

OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

5-2、讀取檔案資訊,放入數組

# 讀取檔案
def Read():
    global Data_Array
    Data_Array = open('Authorited.txt').read().splitlines() #按行分隔
    print('已授權的資料:\n', Data_Array)
           

5-3、判斷二維碼是否授權

# 判斷二維碼是否授權
def Judge(data):
    global color
    if data in Data_Array:      #成功
        color = (0, 255, 0)     #綠色标記
        print('Authorized\n')
    else:                       #失敗
        color = (0, 0, 255)     #紅色标記
        print('Unauthorized\n')
           
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼
OpenCV(項目)二維碼識别(二維碼、條形碼)過程總代碼

總代碼

# 二維碼識别
import cv2
import numpy as np
from pyzbar.pyzbar import decode

# 讀取檔案
def Read():
    global Data_Array
    Data_Array = open('Authorited.txt').read().splitlines() #按行分隔
    print('已授權的資料:',Data_Array,'\n')


# 判斷二維碼是否授權
def Judge(data):
    global color
    if data in Data_Array:      #成功
        color = (0, 255, 0)     #綠色标記
        print('Authorized\n')
    else:                       #失敗
        color = (0, 0, 255)     #紅色标記
        print('Unauthorized\n')


# 檢測圖像中的碼(解碼)
def Read_Decode_Pic(image):
    # 周遊解碼
    for code in decode(image):
        # print("條形碼/二維碼:", code)
        data = code.data.decode('utf-8')
        print("條形碼/二維碼資料:", data)    #解碼資料

        # 判斷二維碼是否授權
        Judge(data)

        # 多邊形擷取(矩形的框)
        pts_poly= np.array(code.polygon, np.int32)          #擷取多邊形坐标
        cv2.polylines(image, [pts_poly], True, color, 5)    #畫多邊形框

        # 顯示資料(擷取矩形框的左上角作為Text的坐标(左邊坐标),顯示資料)
        pts_rect = code.rect
        # print(pts_rect)
        cv2.putText(image, data, (pts_rect[0],pts_rect[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
        #                  顯示資料  矩形坐标                   字型類型                 字型大小 顔色     粗細

    cv2.imshow('image', image)      #等畫出所有矩形後顯示


# 檢測視訊中的碼(解碼)
def Read_Decode_Cam():
    cap = cv2.VideoCapture(0)           #打開視訊
    cap.set(3, 1000)                    #幀的寬度
    cap.set(4, 800)                     #幀的高度

    while True:
        success, image = cap.read()     #擷取每一幀圖檔
        cv2.imshow('image', image)

        image = Read_Decode_Pic(image)  #對每一幀圖檔檢測

        cv2.waitKey(1)                  #延時1ms


if __name__ == '__main__':
    Read()                          #讀取檔案
    img = cv2.imread('Resource/qrcode.jpg')
    Read_Decode_Pic(img)           # 檢測圖像中的碼(解碼)
    Read_Decode_Cam()              # 檢測視訊中的碼(解碼)

    cv2.waitKey(0)
           

繼續閱讀