目錄
過程
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循環中進行,不能直接指派
二維碼:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TQiZDbzgFMGdlW5RmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLygjN3UTO0ATMzIDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
條形碼:
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
3、檢測出二維碼框
如果是矩形框的話,比較友善,但是旋轉情況下,會不準确。因為rect擷取的是正的矩形,無法旋轉。
# 畫出矩形
pts = code.rect #得到矩形四個角
cv2.rectangle(image, pts, (255,0,255), 3) #畫出矩形
是以我們需要擷取多邊形對它進行旋轉:
注:polylines函數中需要的坐标類型是是CV_32S,是以需要轉換一下
# 多邊形擷取(矩形的框)
pts = np.array(code.polygon, np.int32) #擷取多邊形坐标
cv2.polylines(image, [pts], True, (0,0,255), 5) #畫多邊形框
可以發現,這時我們可以檢測到旋轉的矩形框。
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)
# 顯示資料 矩形坐标 字型類型 字型大小 顔色 粗細
5、添加資料,判斷二維碼是否授權
建立一個檔案,裡面放入一些二維碼資料庫,讀取檔案,判斷二維碼的資料是否在資料庫裡面。(不在則紅色,表示未授權;在則綠色,表示已授權)
5-1:、添加資料
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')
總代碼
# 二維碼識别
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)