QR碼(快速響應(yīng)碼)是一種矩陣條形碼,其中包含有關(guān)它所附加的項(xiàng)目的信息,如位置數(shù)據(jù)、標(biāo)識符或識別網(wǎng)站或應(yīng)用程序的跟蹤器等。它是一種機(jī)器可讀的光學(xué)二維圖像形式的標(biāo)簽,具有不同的圖案。在本教程中,我們將使用OpenCV和ZBar庫構(gòu)建一個基于RaspberryPi的二維碼掃描器。
要求
樹莓派 3(任何版本)
Pi 相機(jī)模塊
在繼續(xù)這個Raspberry Pi 3 二維碼掃描器之前,我們首先需要在這個項(xiàng)目中安裝 OpenCV、條碼解碼庫 ZBar、imutils 和一些其他依賴項(xiàng)。OpenCV 在這里用于數(shù)字圖像處理。數(shù)字圖像處理最常見的應(yīng)用是 物體檢測、 人臉識別和人數(shù)統(tǒng)計(jì)。
在樹莓派中安裝 OpenCV
這里 OpenCV 庫將用于 Raspberry Pi QR 掃描儀。要安裝 OpenCV,首先,更新 Raspberry Pi。
sudo apt-get 更新
然后安裝在 Raspberry Pi 上安裝 OpenCV 所需的依賴項(xiàng)。
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get install libqt4-test –y
之后,使用以下命令在 Raspberry Pi 中安裝 OpenCV。
pip3 安裝 opencv-contrib-python==4.1.0.25
安裝其他必需的軟件包
安裝ZBar
Zbar 是檢測和解碼不同類型條碼和二維碼的最佳庫。使用以下命令安裝庫:
pip3 安裝 pyzbar
安裝imutils
imutils 用于使基本的圖像處理功能,如平移、旋轉(zhuǎn)、調(diào)整大小、骨架化和使用 OpenCV 更輕松地顯示 Matplotlib 圖像。使用以下命令安裝 imutils:
pip3 安裝 imutils
安裝argparse
使用以下命令安裝 argparse 庫。argparse負(fù)責(zé)解析命令行參數(shù)。
pip3 安裝 argparse
樹莓派二維碼閱讀器硬件設(shè)置
在這里,我們只需要 Raspberry Pi 和 Pi 相機(jī),用于使用 Raspberry Pi 相機(jī)的 QR 碼掃描儀,您只需將相機(jī)色帶連接器連接到 Raspberry pi 中提供的相機(jī)插槽中
Pi 攝像頭可用于構(gòu)建各種有趣的項(xiàng)目,如Raspberry Pi 監(jiān)控?cái)z像頭、訪客監(jiān)控系統(tǒng)、家庭安全系統(tǒng)等。
Raspberry Pi 二維碼閱讀器的 Python 代碼
Raspberry Pi QR 閱讀器的完整代碼在頁面末尾給出。在我們對 Raspberry Pi 進(jìn)行編程之前,讓我們了解一下代碼。
因此,像往常一樣,通過導(dǎo)入所有必需的包來啟動代碼。
從 imutils.video 導(dǎo)入 VideoStream 從 pyzbar 導(dǎo)入 pyzbar 導(dǎo)入?yún)?shù)解析 導(dǎo)入日期時(shí)間 導(dǎo)入 imutils 進(jìn)口時(shí)間 導(dǎo)入cv2?
然后構(gòu)造參數(shù)解析器并解析參數(shù)。命令行參數(shù)包含有關(guān) CSV 文件路徑的信息。CSV(逗號分隔值)文件包含我們視頻流中每個條形碼的時(shí)間戳和有效負(fù)載。
ap = argparse.ArgumentParser() ap.add_argument("-o", "--output", type=str, default="barcodes.csv", help="輸出包含條形碼的 CSV 文件的路徑") args = vars(ap.parse_args())
之后,如果您使用 USB 網(wǎng)絡(luò)攝像頭,請初始化視頻流并取消注釋注釋行。
#vs = VideoStream(src=0).start() vs = VideoStream(usePiCamera=True).start() 時(shí)間.sleep(2.0)
現(xiàn)在在循環(huán)中,從視頻流中抓取一幀并將其調(diào)整為 400 像素。一旦它抓取到幀,調(diào)用pyzbar.decode函數(shù)來檢測和解碼 QR 碼。
幀 = vs.read() 框架 = imutils.resize(框架,寬度 = 400) 條形碼 = pyzbar.decode(frame)
現(xiàn)在,循環(huán)檢測到的條形碼以提取條形碼的位置并在圖像上的條形碼周圍繪制邊界框。
對于條形碼中的條形碼: (x, y, w, h) = 條形碼.rect cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
然后使用解碼(“utf-8”)函數(shù)將檢測到的條形碼解碼為“utf-8”字符串,然后使用barcode.type函數(shù)提取條形碼的類型。
條碼數(shù)據(jù) = 條碼.data.decode(“utf-8”)
條碼類型 = 條碼類型
之后,將提取的條形碼數(shù)據(jù)和條形碼類型保存在一個名為 text 的變量中,并在圖像上繪制條形碼數(shù)據(jù)和類型。
text = “{} ({})”.format(barcodeData,barcodeType)
cv2.putText(框架,文本,(x,y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
現(xiàn)在顯示帶有條形碼數(shù)據(jù)和條形碼類型的輸出。
cv2.imshow(“條碼閱讀器”, frame)
現(xiàn)在在最后一步,檢查是否按下了鍵‘s’,然后中斷主循環(huán)并開始清理過程。
鍵 = cv2.waitKey(1) & 0xFF
# 如果 `s` 鍵被按下,退出循環(huán)
如果鍵 == ord(“s”):
休息
print(“[INFO] 清理。..”)
csv.close()
cv2.destroyAllWindows()
與停止()
測試 Raspberry Pi 二維碼掃描器
設(shè)置完成后,啟動 QR 碼閱讀器程序。您將看到一個窗口,顯示來自您的攝像頭的實(shí)時(shí)視圖,現(xiàn)在您可以在 PI 攝像頭前顯示條形碼。當(dāng) pi 解碼條碼時(shí),它會在其周圍繪制一個帶有條碼數(shù)據(jù)和條碼類型的紅色框,如下圖所示:
這就是您只需使用 Raspberry Pi 板和 Pi 相機(jī)或 USB 相機(jī)即可輕松構(gòu)建Raspberry Pi 相機(jī) QR 碼閱讀器的方法。
從 imutils.video 導(dǎo)入 VideoStream
從 pyzbar 導(dǎo)入 pyzbar
導(dǎo)入?yún)?shù)解析
導(dǎo)入日期時(shí)間
導(dǎo)入 imutils
進(jìn)口時(shí)間
導(dǎo)入簡歷2
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="barcodes.csv",
help="輸出包含條形碼的 CSV 文件的路徑")
args = vars(ap.parse_args())
#vs = VideoStream(src=0).start() #如果您使用的是網(wǎng)絡(luò)攝像頭,請取消注釋
vs = VideoStream(usePiCamera=True).start() # 用于 Pi 相機(jī)
時(shí)間.sleep(2.0)
csv = open(args["輸出"], "w")
找到 = 設(shè)置()
而真:
幀 = vs.read()
框架 = imutils.resize(框架,寬度 = 400)
條形碼 = pyzbar.decode(frame)
對于條形碼中的條形碼:
(x, y, w, h) = 條形碼.rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
條碼數(shù)據(jù) = 條碼.data.decode("utf-8")
條碼類型 = 條碼類型
text = "{} ({})".format(barcodeData,barcodeType)
打?。ㄎ谋荆?br />
cv2.putText(框架,文本,(x,y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# 如果條形碼文本當(dāng)前不在我們的 CSV 文件中,則寫入
# 時(shí)間戳+條形碼到磁盤并更新集合
如果沒有找到barcodeData:
csv.write("{},{}\n".format(datetime.datetime.now(),
條形碼數(shù)據(jù)))
csv.flush()
found.add(barcodeData)
cv2.imshow("條碼閱讀器", frame)
鍵 = cv2.waitKey(1) & 0xFF
# 如果 `s` 鍵被按下,退出循環(huán)
如果鍵 == ord("s"):
休息
print("[INFO] 清理...")
csv.close()
cv2.destroyAllWindows()
與停止()
-
二維碼
+關(guān)注
關(guān)注
7文章
406瀏覽量
26369 -
OpenCV
+關(guān)注
關(guān)注
29文章
624瀏覽量
41214 -
掃描器
+關(guān)注
關(guān)注
0文章
153瀏覽量
11880 -
RaspberryPi
+關(guān)注
關(guān)注
1文章
38瀏覽量
9058
發(fā)布評論請先 登錄
相關(guān)推薦
評論