使用Pyhthon,OpenCV和ZBar构建移动的条码扫描器
生活随笔
收集整理的這篇文章主要介紹了
使用Pyhthon,OpenCV和ZBar构建移动的条码扫描器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用帶ZBar的OpenCV條形碼和QR碼掃描儀。可以非常輕松地將條形碼解碼為可讀的文本。
使用Pyhthon,OpenCV和ZBar讀取條形碼和QR碼為文本
- 1. 效果圖
- 2. 條碼分類
- 3. 步驟
- 3. 源代碼
- 1)單圖檢測
- 2) 實時檢測
- 參考
1. 效果圖
單圖檢測效果圖:(圖片來源網絡,侵刪)
單圖檢測示例2,有部分沒檢測出來
條碼和QR碼同時存在,效果圖
2. 條碼分類
條碼分為
- barcode 條形碼;掃描需直線對準掃描器;
- QR 碼 ;“Quick Response” 的縮寫,快速反應的意思。源自發明者希望 QR 碼可讓其內容快速被解碼。QR碼比普通條碼可儲存更多資料,亦無需像普通條碼般在掃描時需直線對準掃描器。
3. 步驟
1) 安裝Python綁定的 zbar庫 (官方zbar只支持python2.7不支持python 3,pyzbar支持python 3,但不好下載)。 發生超時下載不下來可參考:https://blog.csdn.net/weixin_40668374/article/details/107868341 ,親測有效;
2) 在單個圖像中使用zbar庫編碼和解碼條碼;
3) 使用OpenCV和ZBar實時讀取條形碼和QR碼;
一維條形碼對系統來說更具挑戰性,特別是對于不支持自動對焦的PiCamera。建議使用USB網絡攝像頭,因為它具有出色的自動對焦功能。
3. 源代碼
1)單圖檢測
# USAGE
# python barcode_scanner_image.py --image barcode.jpg# 導入必要的包
from pyzbar import pyzbar
import argparse
import cv2# 構建命令行參數及解析
# --image 圖像的路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to input image")
args = vars(ap.parse_args())# 加載輸入圖像
image = cv2.imread(args["image"])# 調用pyzbar.decode 在圖像中查找并解碼條形碼
barcodes = pyzbar.decode(image)
if barcodes is None or len(barcodes) == 0:print('no barcode found...')# 遍歷檢測到的條碼
for barcode in barcodes:# 提取條碼的邊界框坐標 并在圖像上圍繞條碼繪制紅色框(x, y, w, h) = barcode.rectcv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)# 條碼內容是一個字節對象 轉換為字符串并繪制到圖像上# .decode(“ utf-8”)至關重要 函數將字節數組轉換為字符串barcodeData = barcode.data.decode("utf-8")barcodeType = barcode.type# 繪制條碼內容和類型到圖像上text = "{} ({})".format(barcodeData, barcodeType)cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 0, 255), 2)# 打印條碼類型和內容到終端窗口print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))# 展示輸出圖像
cv2.imshow("Image", image)
cv2.waitKey(0)
2) 實時檢測
# USAGE
# python barcode_scanner_video.py# 導入必要的包
from imutils.video import VideoStream
from pyzbar import pyzbar
import argparse
import datetime
import imutils
import time
import cv2# 構建命令行參數和解析
# --output 其中包含輸出逗號分隔值(CSV)文件的路徑。該文件將包含視頻流中每個檢測到的和解碼的條形碼的時間戳和有效載荷。
# 如果未指定此參數,則CSV文件將默認放置在我們當前的工作目錄中,名稱為“ barcodes.csv”
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="barcodes.csv",help="path to output CSV file containing barcodes")
args = vars(ap.parse_args())# 使用VideoStream以高效,線程化的方式處理捕獲視頻幀。
# 初始化視頻流VideoStream 并預熱
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start() # 使用USB網絡攝像頭
# vs = VideoStream(usePiCamera=True).start() #使用Pi攝像頭
time.sleep(2.0) # 暫停2s預熱相# 打開輸出csv文件以寫入并初始化
csv = open(args["output"], "w") # w寫入文件 a追加文件
found = set() #初始化一個set以記錄條碼避免重復項# 遍歷視頻的每一幀
while True:# 獲取線程化視頻流的幀,并縮放到寬度400frame = vs.read()frame = imutils.resize(frame, width=400)# 調用pyzbar.decode 檢測并解碼框架中的任何QR +條形碼barcodes = pyzbar.decode(frame)# 遍歷檢測到的條形碼for barcode in barcodes:# 提取條碼的邊界框并繪制矩形框在圖像上(x, y, w, h) = barcode.rectcv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)#轉換條碼二進制字節流為字符串以在圖像上顯示barcodeData = barcode.data.decode("utf-8")barcodeType = barcode.type# 繪制條碼內容和條碼類型在圖像上text = "{} ({})".format(barcodeData, barcodeType)cv2.putText(frame, text, (x, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)# 如果條碼不在csv中,寫入時間戳+內容到csv,并更新set集if barcodeData not in found:csv.write("{},{}\n".format(datetime.datetime.now(),barcodeData))csv.flush()found.add(barcodeData)# 展示輸出幀cv2.imshow("Barcode Scanner", frame)key = cv2.waitKey(1) & 0xFF# 如果‘q’鍵被按下,則停止遍歷if key == ord("q"):break# 清理工作,關閉csv流,清除窗口,停止視頻流處理線程
print("[INFO] cleaning up...")
csv.close()
cv2.destroyAllWindows()
vs.stop()
參考
- https://www.pyimagesearch.com/2018/05/21/an-opencv-barcode-and-qr-code-scanner-with-zbar/
- https://blog.csdn.net/weixin_40668374/article/details/107868341
總結
以上是生活随笔為你收集整理的使用Pyhthon,OpenCV和ZBar构建移动的条码扫描器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Numpy数组图像基本操作方法,及截取R
- 下一篇: 使用Python,OpenCV寻找图像中