OpenCV和Pyzbar檢測二維碼和條碼
概述
在現(xiàn)代社會,二維碼和條碼的應(yīng)用非常廣泛,從商品標簽到支付二維碼,幾乎無處不在。本文將詳細介紹如何使用 OpenCV 和 Pyzbar 庫在 Python 中檢測并識別二維碼和條碼,并通過具體的代碼示例來展示整個過程。
環(huán)境準備
在開始之前,請確保已經(jīng)安裝了所需的庫??梢酝ㄟ^以下命令進行安裝:
pip install opencv-python pyzbar
完整示例代碼詳解
import cv2
import numpy as np
from pyzbar import pyzbar
class CodeFinder:
"""
二維碼、條碼檢測
"""
def __init__(self):
"""
初始化攝像頭并設(shè)置分辨率
"""
self.cap = cv2.VideoCapture(0) # 打開默認攝像頭
self.cap.set(3, 640) # 設(shè)置視頻寬度為640像素
self.cap.set(4, 480) # 設(shè)置視頻高度為480像素
def run(self):
"""
捕獲視頻并檢測二維碼和條碼
"""
while True:
success, img = self.cap.read() # 讀取一幀視頻
if not success:
print("Failed to read frame")
break
# 檢測圖像中的二維碼和條碼
for bar_code in pyzbar.decode(img):
# 解碼二維碼數(shù)據(jù)
print(bar_code.data.decode('utf8')) # 打印二維碼數(shù)據(jù)
print(bar_code.type) # 打印二維碼類型
print(bar_code.rect) # 打印二維碼四周邊界(矩形框)
print(bar_code.polygon) # 打印二維碼多邊形邊框
print(bar_code.quality) # 打印二維碼質(zhì)量
print(bar_code.orientation) # 打印二維碼方向
# 繪制二維碼邊界
points = np.array(bar_code.polygon, np.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)
# 在圖像上顯示二維碼數(shù)據(jù)
cv2.putText(
img=img,
text=bar_code.data.decode('utf8'),
org=(bar_code.rect.left, bar_code.rect.top),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=0.8,
color=(0, 0, 255),
thickness=2
)
# 顯示圖像
cv2.imshow('code', img)
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) & 0xFF == ord('q'):
self.cap.release() # 釋放攝像頭資源
cv2.destroyAllWindows() # 關(guān)閉所有OpenCV窗口
break
if __name__ == '__main__':
code_finder = CodeFinder()
code_finder.run()
代碼解析
1. 導(dǎo)入必要的庫
import cv2 import numpy as np from pyzbar import pyzbar
- cv2:OpenCV 的 Python 接口,用于圖像和視頻處理。
- numpy:用于處理圖像數(shù)據(jù)的數(shù)組。
- pyzbar:用于解碼二維碼和條碼的庫。
2. 定義 CodeFinder 類
class CodeFinder:
"""
二維碼、條碼檢測
"""
def __init__(self):
"""
初始化攝像頭并設(shè)置分辨率
"""
self.cap = cv2.VideoCapture(0) # 打開默認攝像頭
self.cap.set(3, 640) # 設(shè)置視頻寬度為640像素
self.cap.set(4, 480) # 設(shè)置視頻高度為480像素
初始化攝像頭:
self.cap = cv2.VideoCapture(0):打開默認攝像頭(ID 為 0)。
self.cap.set(3, 640):設(shè)置視頻寬度為 640 像素。
self.cap.set(4, 480):設(shè)置視頻高度為 480 像素。
3. 定義 run 方法
def run(self):
"""
捕獲視頻并檢測二維碼和條碼
"""
while True:
success, img = self.cap.read() # 讀取一幀視頻
if not success:
print("Failed to read frame")
break
# 檢測圖像中的二維碼和條碼
for bar_code in pyzbar.decode(img):
# 解碼二維碼數(shù)據(jù)
print(bar_code.data.decode('utf8')) # 打印二維碼數(shù)據(jù)
print(bar_code.type) # 打印二維碼類型
print(bar_code.rect) # 打印二維碼四周邊界(矩形框)
print(bar_code.polygon) # 打印二維碼多邊形邊框
print(bar_code.quality) # 打印二維碼質(zhì)量
print(bar_code.orientation) # 打印二維碼方向
# 繪制二維碼邊界
points = np.array(bar_code.polygon, np.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)
# 在圖像上顯示二維碼數(shù)據(jù)
cv2.putText(
img=img,
text=bar_code.data.decode('utf8'),
org=(bar_code.rect.left, bar_code.rect.top),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=0.8,
color=(0, 0, 255),
thickness=2
)
# 顯示圖像
cv2.imshow('code', img)
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) & 0xFF == ord('q'):
self.cap.release() # 釋放攝像頭資源
cv2.destroyAllWindows() # 關(guān)閉所有OpenCV窗口
break
讀取視頻幀:
success, img = self.cap.read():讀取一幀視頻。success 表示是否成功讀取,img 是讀取到的圖像。
如果讀取失敗,打印錯誤信息并退出循環(huán)。
檢測二維碼和條碼:
- for bar_code in pyzbar.decode(img):使用 pyzbar.decode() 函數(shù)檢測圖像中的二維碼和條碼。
- print(bar_code.data.decode('utf8')):打印二維碼數(shù)據(jù)。
- print(bar_code.type):打印二維碼類型。
- print(bar_code.rect):打印二維碼四周邊界(矩形框)。
- print(bar_code.polygon):打印二維碼多邊形邊框。
- print(bar_code.quality):打印二維碼質(zhì)量。
- print(bar_code.orientation):打印二維碼方向。
繪制二維碼邊界:
points = np.array(bar_code.polygon, np.int32):將二維碼多邊形邊框轉(zhuǎn)換為 NumPy 數(shù)組。
points = points.reshape((-1, 1, 2)):重塑數(shù)組形狀。
cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3):使用 cv2.polylines() 函數(shù)繪制多邊形邊框。
在圖像上顯示二維碼數(shù)據(jù):
cv2.putText():在圖像上顯示二維碼數(shù)據(jù)。
text=bar_code.data.decode('utf8'):要顯示的文本內(nèi)容。
org=(bar_code.rect.left, bar_code.rect.top):文本的起始位置。
fontFace=cv2.FONT_HERSHEY_SIMPLEX:使用的字體類型。
fontScale=0.8:字體大小。
color=(0, 0, 255):文本顏色。
thickness=2:文本線寬。
顯示圖像:
cv2.imshow('code', img):顯示圖像。
按鍵檢測:
if cv2.waitKey(1) & 0xFF == ord('q'):等待1毫秒,如果有按鍵按下,返回按鍵的ASCII碼。ord('q') 返回字符 ‘q’ 的ASCII碼。如果按鍵為 ‘q’,則退出循環(huán)。
self.cap.release():釋放攝像頭資源。
cv2.destroyAllWindows():關(guān)閉所有OpenCV窗口。
4. 主函數(shù)
if __name__ == '__main__':
code_finder = CodeFinder()
code_finder.run()
主函數(shù):
if __name__ == '__main__'::確保當腳本直接運行時才執(zhí)行以下代碼。
創(chuàng)建 CodeFinder 對象并調(diào)用 run 方法來啟動二維碼和條碼檢測。
總結(jié)
本文詳細介紹了如何使用 OpenCV 和 Pyzbar 庫在 Python 中檢測并識別二維碼和條碼,并通過具體的代碼示例展示了整個過程。通過使用 cv2.VideoCapture()、pyzbar.decode()、cv2.polylines() 和 cv2.putText() 等函數(shù),我們可以輕松地處理視頻流中的二維碼和條碼數(shù)據(jù)。
到此這篇關(guān)于OpenCV和Pyzbar檢測二維碼和條碼的文章就介紹到這了,更多相關(guān)OpenCV Pyzbar檢測二維碼和條碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?Selenium動態(tài)渲染頁面和抓取的使用指南
在Web數(shù)據(jù)采集領(lǐng)域,動態(tài)渲染頁面已成為現(xiàn)代網(wǎng)站的主流形式,本文將從技術(shù)原理,環(huán)境配置,核心功能系統(tǒng)講解Selenium在Python動態(tài)爬蟲中的應(yīng)用,需要的可以參考下2025-05-05
phpsir 開發(fā) 一個檢測百度關(guān)鍵字網(wǎng)站排名的python 程序
一個檢測百度關(guān)鍵字網(wǎng)站排名的python 程序 phpsir 開發(fā)2009-09-09
Python實現(xiàn)灰色關(guān)聯(lián)分析與結(jié)果可視化的詳細代碼
今天小編通過代碼以灰色色系為例給大家介紹Python灰色關(guān)聯(lián)分析實現(xiàn)方法,灰色關(guān)聯(lián)度分析對于一個系統(tǒng)發(fā)展變化態(tài)勢提供了量化的度量,非常適合動態(tài)歷程分析,感興趣的朋友一起看看吧2022-03-03
Python?pickle?二進制序列化和反序列化及數(shù)據(jù)持久化詳解
這篇文章主要介紹了Python?pickle?二進制序列化和反序列化?-?數(shù)據(jù)持久化,模塊?pickle?實現(xiàn)了對一個?Python?對象結(jié)構(gòu)的二進制序列化和反序列化,本文介紹了Pickle的基本用法,需要的朋友可以參考下2024-01-01
使用Python開發(fā)Telegram?Bot的流程步驟
Telegram?Bot?是一種可以與用戶交互的機器人應(yīng)用程序,通過?Telegram?的?Bot?API?與服務(wù)器通信,它可以用來處理消息、執(zhí)行命令、提供服務(wù),如通知提醒、數(shù)據(jù)查詢和自動化任務(wù)等,本文給大家介紹了如何用?Python?開發(fā)一個?Telegram?Bot,需要的朋友可以參考下2025-01-01
Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么
本篇文章對Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么,進行了很好的講解,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

