1. 程式人生 > >OpenCV和Zbar兩個Python模組實現二維碼和條形碼識別

OpenCV和Zbar兩個Python模組實現二維碼和條形碼識別

在我們的日常生活中,處處可見條形碼和二維碼。

在以前,我們去逛書店時,或者你現在隨手拿起你身邊的一本書,你肯定能看到書本的封頁後面印有一排黑色線條組成的標籤,也就是條形碼;你去你們學校的自助機上借書還書時識別的也是條形碼;哦,對了,你還記得每次大型考試答題卡上都會貼上監考老師分發給你的那個標籤嗎?還是條形碼;甚至現在你隨隨便便逛個超市或便利店,收銀員或者自助機也都是通過掃商品條形碼給你計價的。條形碼在我們的日常生活中真的是隨處可見。

到了後來,2016年之後,二維碼也漸漸開始普及起來,現在二維碼幾乎成了我們日常生活的一部分:新朋友微信加個好友;上下班搭乘公交地鐵;平時買東西付款;和別人收付款的當面交易;各個大小公司或者商場甚至地攤搞活動的時候也告訴你掃碼有優惠。

現在只要你出門,或者你不出門,你只要用手機,你是個網民,你就很難不接觸到各種條形碼與二維碼。

那麼這些個條形碼識別和二維碼識別是怎麼完成的呢?

其實使用OpenCV和Zbar這兩個python模組就可以實現二維碼和條形碼的識別。

1.軟體安裝

在Ubuntu上安裝Zbar:

$ sudo apt-get install libzbar0

在MacOS系統中安裝Zbar:

$ brew install zbar

另外還需要安裝OpenCV:
pip install opencv-python

2.識別圖片上的二維碼或條形碼

# 匯入模組
from pyzbar import pyzbar
import matplotlib.pyplot as plt
import cv2
# 讀取圖片
image = cv2.imread('image.jpeg')
# 找到影象中的條形碼並進行解碼
barcodes = pyzbar.decode(image)
def decode(image, barcodes):
    # 迴圈檢測到的條形碼
    for barcode in barcodes:
        # 提取條形碼的邊界框的位置
         # 畫出影象中條形碼的邊界框
        (x, y, w, h) = barcode.rect
        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
        # 條形碼資料為位元組物件,所以如果我們想在輸出影象上
        # 畫出來,就需要先將它轉換成字串
        barcodeData = barcode.data.decode("utf-8")
        barcodeType = barcode.type
        # 繪出影象上條形碼的資料和條形碼型別
        text = "{} ({})".format(barcodeData, barcodeType)
        cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,.8, (255, 0, 0), 2)
        # 向終端列印條形碼資料和條形碼型別
        print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
    plt.figure(figsize=(10,10))
    plt.imshow(image)
plt.show()
#. 識別二維碼
decode(image, barcodes)
# 讀取圖片
image = cv2.imread('image2.png')
# 找到影象中的條形碼並進行解碼
barcodes = pyzbar.decode(image)
# 識別條形碼
decode(image, barcodes)

輸出結果
[INFO] Found QRCODE barcode: http://weixin.qq.com/r/-irJ0RbEbU***VKy93-s
OpenCV和Zbar兩個Python模組實現二維碼和條形碼識別

[INFO] Found CODE128 barcode: http://weixin.qq.com/r/-irJ0RbEbU***VKy93-s
OpenCV和Zbar兩個Python模組實現二維碼和條形碼識別

3.識別視訊中的二維碼或條形碼

from pyzbar import pyzbar
import cv2
# 獲取二維碼或條形碼
def decode(image):
    # 找到影象中的條形碼並進行解碼
    barcodes = pyzbar.decode(image)
    # 迴圈檢測到的條形碼
    for barcode in barcodes:
        # 提取條形碼的邊界框的位置
        # 畫出影象中條形碼的邊界框
        (x, y, w, h) = barcode.rect
        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
        # 條形碼資料為位元組物件,所以如果我們想在輸出影象上
        # 畫出來,就需要先將它轉換成字串
        barcodeData = barcode.data.decode("utf-8")
        barcodeType = barcode.type
        # 繪出影象上條形碼的資料和條形碼型別
        text = "{} ({})".format(barcodeData, barcodeType)
        cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,.8, (255, 0, 0), 2)
# 讀取攝像頭
cap = cv2.VideoCapture(0)
while(True):
    ret, frame = cap.read()
    if ret==True:
        # 獲取二維碼或條形碼
        decode(frame)
        # 顯示圖片
        cv2.imshow('frame',frame)
        # 按q退出
        if cv2.waitKey(1) & 0xff == ord('q'):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

識別效果視訊地址

參考資料: www.pyimagesearch.com

4.專案打包

百度雲盤
用OpenCV和Python識別二維碼和條形碼
https://pan.baidu.com/s/14CKjZh9YnyDa-KmY2wJcKg