使用python玩转二维码!速学速用!

发表于:2022-12-12 09:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ShowMeAI    来源:稀土掘金

  二维码用某种特定的几何图形来记录数据符号信息,这些黑白相间的图形按照一定的规律分布在平面上(二维方向)。二维码是目前最常使用的快捷信息存储方式之一,微信等都可以通过这项技术实现快扫快用。
  在本篇内容中,ShowMeAI带大家来学习二维码的应用技能,包括构建二维码和解码二维码。
  二维码历史
  QR(Quick Response,快速响应)Code 诞生于 1994 年的日本汽车公司 Denso Wave,是一种二维条形码,由在白色背景上排列成方形网格的黑色方块组成,允许立即访问隐藏在代码中的信息。
  QR码(也就是我们常说的二维码)可存储 7000 多个字符,由相机等设备读取,并从像素图像中解析出包含的信息,读取速度比其他条码快得多。
  二维码应用场景
  生成和读取二维码的简便性导致它们在零售店、银行、医院、旅游和食品服务行业的产品包装、非接触式商务、订单处理、结帐和支付服务中得到广泛采用。我们常用到通信软件、社交平台都几乎都可以通过二维码来扫码识别。
  2020 年 9 月对美国和英国消费者进行的一项调查发现,在COVID-19大流行期间二维码的使用有所增加。
  生成二维码
  我们先安装和导入本次需要用到的 Python 工具库qrcode,它可以很方便地创建和读取二维码。
  import qrcode
  创建数据。
  data="https://www.showmeai.tech"
  创建二维码实例。
  qr= qrcode.QRCode(version=1, box_size=10, border=4, error_correction=qrcode.constants.ERROR_CORRECT_H)
  我们对参数做一个解释:
  ·version参数是一个从 1 到 40 的整数,控制二维码的大小;最小的是版本 1,它是一个 21x21 矩阵。
  · box_size参数控制二维码每个方框的像素数。
  · border控制框边框的粗细。
  · error_correction控制用于 QR 码的纠错,特别是当 QR 码因错误而无法读取时。选项 error_correction包括:
      · ERROR_CORRECT_L:可以纠正大约 7% 或更少的错误
      · ERROR_CORRECT_M(默认):可以纠正大约 15% 或更少的错误。
      · ERROR_CORRECT_Q:可以纠正大约 25% 或更少的错误。
      · ERROR_CORRECT_H:可以纠正大约 30% 或更少的错误。
  qr.add_data(data)
  qr.make(fit=True)
  最后,使用生成二维码make_image()将 QRCode 对象转换为图像文件并保存在文件中。
  qr_img=qr.make_image(fill_color="black", back_color="white")
  qr_img.save("qr.jpg")
  其中,fill_color和back_color可以改变二维码的背景和绘画颜色。
  阅读二维码
  本篇我们将讲解两种不同的方式来读取二维码,使用cv2和pyzbar。
  opencv 读取解码
  导入库。
  import cv2
  打开上方存储的qr.jpg图像文件。
  cv_img= cv2.imread("qr.jpg")
  在 CV2 中创建类 QRCodeDetector 的对象。
  qr_detect= cv2.QRCodeDetector()
  data, bbox, st_qrcode= qr_detect.detectAndDecode(cv_img)
  detectAndDecode()检测并解码图像中存在的二维码。该方法返回以下内容:
  ·解码后的数据,如果没有找到二维码,则数据为空。
  · 包含检测到的二维码顶点的边界框。
  · 可选的包含经过校正和二值化的 QR 码的输出图像。
  print(f"QRCode data:\n{data}")
  pyzbar 读取解码
  使用 cv2 读取图像。
  import cv2
  from pyzbar.pyzbar import decode
  # read the image using cv2
  img = cv2.imread("qr.jpg")
  接下来,找到图像中的条形码和二维码。
  # Decode the barcode and QR Code in the image
  detectedBarcodes = decode(img)
  decode会遍历图像中所有检测到的条形码。返回结果数组的每个元素代表一个检测到的条形码,可以读取图像中的多个条形码或 QR 码。
  每个检测到的条码包含以下信息:
  ·data:条形码/二维码中嵌入的数据。
  · type:它是条码类型,如 QR Code、EAN-13、UPC-A、UPC-E、EAN-8、Code 128 和 Code 39 符号体系。
  · rect:定位框的边界点集合。对于QR码,它是对应QR码四边形的四个角的四个点的列表。
  · polygon:检索位置多边形中的点数。位置多边形定义图像中条形码被解码的区域。
  · quality:质量。
  · orientation:表示条码的方向。
  # read the image in numpy array using cv2
  img = cv2.imread("qr.jpg")# Decode the barcode image
  detectedBarcodes = decode(img)# If barcode is not detected then print the message
  if not detectedBarcodes:
      print("Bar code not detected or your barcode is blank or corrupted!")
  else:# Iterate through all the detected barcodes in image
      for bar_code in detectedBarcodes:# Locate the barcode position in image using rect
          (x, y, w, h) = bar_code.rect# Highlight the rectanngela round the bar code
          cv2.rectangle(img, (x-10, y-10),
                        (x + w+10, y + h+10),
                        (255, 0, 0), 2)if bar_code.data!="":# Print the barcode data
              print(f"Data :  {bar_code.data.decode('UTF-8')}")
              print(f"Bar Code Type: {bar_code.type}")
              print(f"Bar Code Orientation: {bar_code.orientation}")
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号