前言
????????最近需要做一個工訓物料小車掃碼領(lǐng)取任務的功能,于是使用樹莓派的攝像頭掃碼二維碼。經(jīng)過我的多番尋找,發(fā)現(xiàn)有個叫pyzbar的庫,可以結(jié)合opencv,可以做一個視頻動態(tài)二維碼掃描。
? ? ? ? 本文實現(xiàn)的功能:實現(xiàn)樹莓派的二維碼掃描
1. 首先安裝opencv和pyzbar
????????opencv的安裝,這里就不再贅述,沒有在樹莓派上安裝opencv的,可以參考一下這篇博客:樹莓派4 安裝OPENCV3全過程
????????pyzbar的安裝,直接樹莓派終端上使用如下命令即可
pip3 install pyzbar
2. 代碼及注釋
????????我使用的是樹莓派的csi攝像頭,而不是usb攝像頭,具體樹莓派攝像頭一開始如何調(diào)試,如何獲取視頻源,可以參考這篇文章:樹莓派OpenCV系列教程2:攝像頭的基本使用
import time
import cv2
import numpy as np
import pyzbar.pyzbar as pyzbar
# main函數(shù)
if __name__ == '__main__':
# openCV 字體
font = cv2.FONT_HERSHEY_SIMPLEX
# 定義圖像源
cap = cv2.VideoCapture("http://admin:admin@192.168.1.15:8081/") # 0: use CSI camera,1:use USB camera
cap.set(3, 480) # set Width把視頻流的幀(圖片)的寬度調(diào)成480
cap.set(4, 360) # set Height把視頻流的幀(圖片)的高度調(diào)成480
if (not cap.isOpened()):
print("[camera.py:cam]:can't open this camera")
while (cap.isOpened()):
# 讀入圖片
ret, img = cap.read()
# 轉(zhuǎn)灰度
img_ROI_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 解碼 返回了識別到的多個二維碼對象
barcodes = pyzbar.decode(img_ROI_gray)
# 對于每個識別到的二維碼區(qū)域
for barcode in barcodes:
# 條形碼數(shù)據(jù)為字節(jié)對象,所以如果我們想在輸出圖像上
# 畫出來,就需要先將它轉(zhuǎn)換成字符串
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
text = "{} ({})".format(barcodeData, barcodeType)
# 打印字符在圖片上
cv2.putText(img, text, (20, 100), font, 1, (0, 255, 0), 4)
# 向終端打印條形碼數(shù)據(jù)和條形碼類型
print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
# 顯示
# cv2.imshow('img_ROI', img_ROI_gray)
cv2.namedWindow('image', 0)
cv2.resizeWindow('image', 700, 900)
cv2.imshow('image', img)
if (cv2.waitKey(1)) == 27:
break
# 進程停止0.5秒,為了降低圖像識別的幀率,提升性能
time.sleep(0.5)
# 釋放資源
cap.release()
cv2.destroyAllWindows()
? ? ? ? 代碼的功能是在循環(huán)內(nèi),每0.5秒,獲取一幀圖像,然后調(diào)用pyzbar識別二維碼,然后把二維碼信息打印在圖像上, 并將圖像顯示出來。
3. 效果
????????效果圖如下:
?不曉得為什么效果不太好,延遲很高。。。文章來源:http://www.zghlxwxcb.cn/news/detail-621007.html
4. 優(yōu)化
優(yōu)化之后的代碼延遲很低,不卡啦文章來源地址http://www.zghlxwxcb.cn/news/detail-621007.html
# coding:utf8
import cv2
import pyzbar.pyzbar as pyzbar
def decodeDisplay(image,image1):
barcodes = pyzbar.decode(image)
for barcode in barcodes:
# 提取條形碼的邊界框的位置
# 畫出圖像中條形碼的邊界框
(x, y, w, h) = barcode.rect
cv2.rectangle(image1, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 條形碼數(shù)據(jù)為字節(jié)對象,所以如果我們想在輸出圖像上
# 畫出來,就需要先將它轉(zhuǎn)換成字符串
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
# 繪出圖像上條形碼的數(shù)據(jù)和條形碼類型
text = "{} ({})".format(barcodeData, barcodeType)
cv2.putText(image1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,
.5, (0, 0, 125), 2)
# 向終端打印條形碼數(shù)據(jù)和條形碼類型
print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
return image1
def detect():
cap = cv2.VideoCapture(0)
while True:
# 讀取當前幀
ret, img = cap.read()
# 轉(zhuǎn)為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
im = decodeDisplay(gray,img)
key = cv2.waitKey(5)
cv2.namedWindow('image', 0)
cv2.resizeWindow('image', 700, 500)
cv2.imshow("image", im)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
detect()
到了這里,關(guān)于動態(tài)識別二維碼(樹莓派4b + python3 + pyzbar + opencv + 攝像頭)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!