构建一个基于Raspberry Pi的二维码扫描器

描述

  QR码(快速响应码)是一种矩阵条形码,其中包含有关它所附加的项目的信息,如位置数据、标识符或识别网站或应用程序的跟踪器等。它是一种机器可读的光学二维图像形式的标签,具有不同的图案。在本教程中,我们将使用OpenCV和ZBar库构建一个基于RaspberryPi的二维码扫描器。

  要求

  树莓派 3(任何版本)

  Pi 相机模块

  在继续这个Raspberry Pi 3 二维码扫描器之前,我们首先需要在这个项目中安装 OpenCV、条码解码库 ZBar、imutils 和一些其他依赖项。OpenCV 在这里用于数字图像处理。数字图像处理最常见的应用是 物体检测、 人脸识别和人数统计。

在树莓派中安装 OpenCV

这里 OpenCV 库将用于 Raspberry Pi QR 扫描仪。要安装 OpenCV,首先,更新 Raspberry Pi。

 

sudo apt-get 更新

 

然后安装在 Raspberry Pi 上安装 OpenCV 所需的依赖项。

 

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 用于使基本的图像处理功能,如平移、旋转、调整大小、骨架化和使用 OpenCV 更轻松地显示 Matplotlib 图像。使用以下命令安装 imutils:

  pip3 安装 imutils

  安装argparse

  使用以下命令安装 argparse 库。argparse负责解析命令行参数。

  pip3 安装 argparse

  树莓派二维码阅读器硬件设置

  在这里,我们只需要 Raspberry Pi 和 Pi 相机,用于使用 Raspberry Pi 相机的 QR 码扫描仪,您只需将相机色带连接器连接到 Raspberry pi 中提供的相机插槽中

扫描器

  Pi 摄像头可用于构建各种有趣的项目,如Raspberry Pi 监控摄像头、访客监控系统、家庭安全系统等。

Raspberry Pi 二维码阅读器的 Python 代码

Raspberry Pi QR 阅读器的完整代码在页面末尾给出。在我们对 Raspberry Pi 进行编程之前,让我们了解一下代码。

因此,像往常一样,通过导入所有必需的包来启动代码。

 

从 imutils.video 导入 VideoStream
从 pyzbar 导入 pyzbar
导入参数解析
导入日期时间
导入 imutils
进口时间
导入cv2​

 

然后构造参数解析器并解析参数。命令行参数包含有关 CSV 文件路径的信息。CSV(逗号分隔值)文件包含我们视频流中每个条形码的时间戳和有效负载。

 

ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="barcodes.csv",
            help="输出包含条形码的 CSV 文件的路径")
args = vars(ap.parse_args())

 

之后,如果您使用 USB 网络摄像头,请初始化视频流并取消注释注释行。

 

#vs = VideoStream(src=0).start()
vs = VideoStream(usePiCamera=True).start()
时间.sleep(2.0)

 

现在在循环中,从视频流中抓取一帧并将其调整为 400 像素。一旦它抓取到帧,调用pyzbar.decode函数来检测和解码 QR 码。

 

帧 = 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)

 

扫描器

  然后使用解码(“utf-8”)函数将检测到的条形码解码为“utf-8”字符串,然后使用barcode.type函数提取条形码的类型。

  条码数据 = 条码.data.decode(“utf-8”)

  条码类型 = 条码类型

  之后,将提取的条形码数据和条形码类型保存在一个名为 text 的变量中,并在图像上绘制条形码数据和类型。

  text = “{} ({})”.format(barcodeData,barcodeType)

  cv2.putText(框架,文本,(x,y - 10),

  cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

扫描器

  现在显示带有条形码数据和条形码类型的输出。

  cv2.imshow(“条码阅读器”, frame)

扫描器

  现在在最后一步,检查是否按下了键‘s’,然后中断主循环并开始清理过程。

  键 = cv2.waitKey(1) & 0xFF

  # 如果 `s` 键被按下,退出循环

  如果键 == ord(“s”):

  休息

  print(“[INFO] 清理。..”)

  csv.close()

  cv2.destroyAllWindows()

  与停止()

  测试 Raspberry Pi 二维码扫描器

  设置完成后,启动 QR 码阅读器程序。您将看到一个窗口,显示来自您的摄像头的实时视图,现在您可以在 PI 摄像头前显示条形码。当 pi 解码条码时,它会在其周围绘制一个带有条码数据和条码类型的红色框,如下图所示:

扫描器

  这就是您只需使用 Raspberry Pi 板和 Pi 相机或 USB 相机即可轻松构建Raspberry Pi 相机 QR 码阅读器的方法。
 

从 imutils.video 导入 VideoStream
从 pyzbar 导入 pyzbar
导入参数解析
导入日期时间
导入 imutils
进口时间
导入简历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() #如果您使用的是网络摄像头,请取消注释
vs = VideoStream(usePiCamera=True).start() # 用于 Pi 相机
时间.sleep(2.0)
csv = open(args["输出"], "w")
找到 = 设置()

而真:
帧 = 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)
条码数据 = 条码.data.decode("utf-8")
条码类型 = 条码类型
text = "{} ({})".format(barcodeData,barcodeType)
打印(文本)
cv2.putText(框架,文本,(x,y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

# 如果条形码文本当前不在我们的 CSV 文件中,则写入
# 时间戳+条形码到磁盘并更新集合
如果没有找到barcodeData:
csv.write("{},{}\n".format(datetime.datetime.now(),
条形码数据))
csv.flush()
found.add(barcodeData)
cv2.imshow("条码阅读器", frame)
键 = cv2.waitKey(1) & 0xFF

# 如果 `s` 键被按下,退出循环
如果键 == ord("s"):
休息
print("[INFO] 清理...")
csv.close()
cv2.destroyAllWindows()
与停止()

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分