Project Icon

QReader

高效稳定的Python QR码识别库

QReader是一个基于YOLOv8的Python库,专门用于识别和解码复杂场景中的QR码。该库集成了先进的QR码检测模型和图像预处理技术,能够在旋转、低分辨率等困难条件下保持较高的识别率。相较于传统方法,QReader表现更为稳定,为开发者提供了可靠的QR码读取解决方案。

QReader

QReader QReader是一个健壮直接的Python解决方案,用于读取图像中难以识别棘手QR码。它由YOLOv8模型驱动。

该库的核心由两个主要组成部分构成:一个经过训练用于检测分割QR码的YOLOv8QR检测器模型(也作为独立项目提供),以及PyzbarQR解码器。利用从这个QR检测器中提取的信息,QReaderPyzbar的基础上透明地应用了不同的图像预处理技术,最大化了难度较大图像的解码率。

安装

要安装QReader,只需运行:

pip install qreader

你可能需要安装一些额外的pyzbar依赖:

Windows上:

极少数情况下,你可能会遇到与lizbar-64.dll相关的丑陋的ImportError。如果发生这种情况,请从_Visual C++ Redistributable Packages for Visual Studio 2013_安装vcredist_x64.exe

Linux上:

sudo apt-get install libzbar0

Mac OS X上:

brew install zbar

要在本地安装QReader包,运行pip

python -m pip install --editable .

注意:如果你在资源非常有限的服务器上运行QReader,你可能想在安装QReader之前安装PyTorchCPU版本。要做到这一点,运行:pip install torch --no-cache-dir(感谢@cjwalther的建议)。

使用方法

在Colab中打开

QReader是一个非常简单直接的库。对于大多数用例,你只需要调用detect_and_decode

from qreader import QReader
import cv2

# 创建一个QReader实例
qreader = QReader()

# 获取包含QR码的图像
image = cv2.cvtColor(cv2.imread("path/to/image.png"), cv2.COLOR_BGR2RGB)

# 使用detect_and_decode函数获取解码后的QR数据
decoded_text = qreader.detect_and_decode(image=image)

detect_and_decode将返回一个tuple,包含图像中每个找到的QR的解码_字符串_。

注意:某些条目可能为None,这种情况发生在QR被检测到但无法解码时。

API参考

QReader(model_size = 's', min_confidence = 0.5, reencode_to = 'shift-jis', weights_folder = None)

这是库的主类。请尽量只实例化一次,以避免每次需要检测QR码时都加载模型。

  • model_sizestr。要使用的模型大小。可以是**'n'(nano)、's'(small)、'm'(medium)或'l'(large)。较大的模型可能更准确但速度较慢。推荐:'s'**(#37)。默认:'s'。
  • min_confidencefloat。QR检测被认为有效的最小置信度。接近0.0的值可能会得到更多_假阳性_,而接近1.0的值可能会丢失难以识别的QR。默认(并推荐):0.5。
  • reencode_tostr | None。用于重新编码utf-8解码后的QR字符串的编码。如果为None,则不会重新编码。如果发现某些字符解码不正确,可以尝试设置与你特定字符集匹配的代码页。已发现有用的建议:
    • 'shift-jis'用于日耳曼语系
    • 'cp65001'用于亚洲语言(感谢@nguyen-viet-hung的建议)
  • weights_folderstr|None。检测模型将被下载的文件夹。如果为None,它将被下载到默认的qrdet包内部文件夹,确保在卸载时正确删除。在像AWS Lambda这样只有/tmp文件夹可写的环境中工作时,你可能需要更改它,如#21中所述。默认:None<qrdet_package>/.model)。

QReader.detect_and_decode(image, return_detections = False)

此方法将解码给定图像中的QR码,并返回解码后的_字符串_(如果检测到但未解码,则返回_None_)。

  • imagenp.ndarray。要读取的图像。预期为_RGB_或_BGR_(uint8)格式(HxWx3)。

  • return_detectionsbool。如果为True,将返回完整的检测结果以及解码后的QR。如果为False,则只返回QR码的解码内容。

  • is_bgrboolean。如果为True,则接收的图像预期为_BGR_而不是_RGB_。

  • 返回tuple[str | None] | tuple[tuple[dict[str, np.ndarray | float | tuple[float | int, float | int]]], str | None]]:一个包含所有检测到的QR码解码结果的元组。如果return_detectionsFalse,输出将如下所示:('解码QR 1', '解码QR 2', None, '解码QR 4', ...)。如果return_detectionsTrue,则如下所示:(('解码QR 1', {'bbox_xyxy': (x1_1, y1_1, x2_1, y2_1), 'confidence': conf_1}), ('解码QR 2', {'bbox_xyxy': (x1_2, y1_2, x2_2, y2_2), 'confidence': conf_2, ...}), ...)。有关检测格式的更多信息,请参阅QReader.detect()

QReader.detect(image)

此方法检测图像中的QR码,并返回包含所有检测信息的_字典元组_。

  • imagenp.ndarray。要读取的图像。预期为_RGB_或_BGR_(uint8)格式(HxWx3)。

  • is_bgrboolean。如果为True,则接收的图像预期为_BGR_而不是_RGB_。

  • 返回tuple[dict[str, np.ndarray|float|tuple[float|int, float|int]]]。包含每个检测的所有信息的字典元组。包含以下键。

值描述值类型值形式
confidence检测置信度floatconf.
bbox_xyxy边界框np.ndarray (4)[x1, y1, x2, y2]
cxcy边界框中心tuple[float, float](x, y)
wh边界框宽度和高度tuple[float, float](w, h)
polygon_xy精确分割_QR_的多边形np.ndarray (N, 2)[[x1, y1], [x2, y2], ...]
quad_xy分割_QR_的四角多边形np.ndarray (4, 2)[[x1, y1], ..., [x4, y4]]
padded_quad_xy填充以完全覆盖polygon_xyquad_xynp.ndarray (4, 2)[[x1, y1], ..., [x4, y4]]
image_shape输入图像的形状tuple[int, int](h, w)

注意:

  • 所有np.ndarray值的类型为np.float32
  • confidenceimage_shape外,所有键都有一个归一化('n')版本。例如,bbox_xyxy表示图像坐标系中的QR边界框[[0., im_w], [0., im_h]],而bbox_xyxyn包含归一化坐标[0., 1.]中的相同边界框。
  • bbox_xyxy[n]polygon_xy[n]被裁剪到image_shape。你可以直接使用它们进行索引,无需进一步处理。

注意:这是你唯一需要的方法吗?看看QRDet

QReader.decode(image, detection_result)

此方法根据给定的检测结果解码图像上的单个二维码。

内部实现上,该方法将运行 pyzbar 解码器,利用 detection_result 的信息,应用不同的图像预处理技术,大大提高解码成功率。

  • imagenp.ndarray。包含要解码的二维码的图像的 NumPy 数组。图像应为 uint8 格式 [HxWxC],RGB。

  • detection_result:dict[str, np.ndarray|float|tuple[float|int, float|int]]。detect 方法返回的检测字典之一。注意,QReader.detect() 返回这些字典的 tuple。此方法只需要其中一个。

  • 返回值:str | None。二维码的解码内容,如果无法读取则返回 None

使用测试

test_on_mobile
两张样例图像。左图是用手机拍摄的图像。右图是贴在绘画上的 64x64 二维码。

以下代码将尝试使用 QReaderpyzbarOpenCV 解码这些包含二维码的图像。

from qreader import QReader
from cv2 import QRCodeDetector, imread
from pyzbar.pyzbar import decode

# 初始化三个测试的读取器(QReader、OpenCV 和 pyzbar)
qreader_reader, cv2_reader, pyzbar_reader = QReader(), QRCodeDetector(), decode

for img_path in ('test_mobile.jpeg', 'test_draw_64x64.jpeg'):
    # 读取图像
    img = imread(img_path)

    # 尝试使用三个读取器解码二维码
    qreader_out = qreader_reader.detect_and_decode(image=img)
    cv2_out = cv2_reader.detectAndDecode(img=img)[0]
    pyzbar_out = pyzbar_reader(image=img)
    # 读取 pyzbar 输出的内容(双重解码可以避免很多错误解码的字符)
    pyzbar_out = tuple(out.data.data.decode('utf-8').encode('shift-jis').decode('utf-8') for out in pyzbar_out)

    # 打印结果
    print(f"图像:{img_path} -> QReader:{qreader_out}。OpenCV:{cv2_out}。pyzbar:{pyzbar_out}。")

上述代码的输出如下:

图像:test_mobile.jpeg -> QReader:('https://github.com/Eric-Canas/QReader')。OpenCV:。pyzbar:()。
图像:test_draw_64x64.jpeg -> QReader:('https://github.com/Eric-Canas/QReader')。OpenCV:。pyzbar:()。

请注意,QReader 内部使用 pyzbar 作为解码器QReader 实现的更高检测-解码率来自于不同图像预处理技术的组合,以及基于 YOLOv8二维码检测器,它能够在比传统计算机视觉方法更困难的条件下检测二维码。

运行测试

可以通过 pytest 启动测试。确保安装了包的测试版本

python -m pip install --editable ".[test]"

然后,你可以运行测试

python -m pytest tests/

基准测试

旋转测试

旋转测试

                             

方法最大旋转角度
Pyzbar17º
OpenCV46º
QReader79º
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号