在我們的日常生活中,處處可見條形碼和二維碼。
在以前,我們去逛書店時,或者你現在隨手拿起你身邊的一本書,你肯定能看到書本的封頁後面印有一排黑色線條組成的標籤,也就是條形碼;你去你們學校的自助機上借書還書時識別的也是條形碼;哦,對了,你還記得每次大型考試答題卡上都會貼上監考老師分發給你的那個標籤嗎?還是條形碼;甚至現在你隨隨便便逛個超市或便利店,收銀員或者自助機也都是通過掃商品條形碼給你計價的。條形碼在我們的日常生活中真的是隨處可見。
到了後來,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
[INFO] Found CODE128 barcode: http://weixin.qq.com/r/-irJ0RbEbU***VKy93-s
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