QReader

QReader

高效稳定的Python QR码识别库

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

QR码识别图像处理Python库YOLOv8PyzbarGithub开源项目

QReader

<img alt="QReader" title="QReader" src="https://yellow-cdn.veclightyear.com/835a84d5/efdc1711-dac2-42be-9891-9c160ee4ce7e.png" width="20%" align="left"> QReader是一个健壮直接的Python解决方案,用于读取图像中难以识别棘手QR码。它由<a href="https://github.com/Eric-Canas/qrdet" target="_blank">YOLOv8</a>模型驱动。

该库的核心由两个主要组成部分构成:一个经过训练用于检测分割QR码的<a href="https://github.com/ultralytics/ultralytics" target="_blank">YOLOv8</a>QR检测器模型(也作为<a href="https://github.com/Eric-Canas/qrdet" target="_blank">独立项目</a>提供),以及<a href="https://github.com/NaturalHistoryMuseum/pyzbar" target="_blank">Pyzbar</a>QR解码器。利用从这个QR检测器中提取的信息,QReader<a href="https://github.com/NaturalHistoryMuseum/pyzbar" target="_blank">Pyzbar</a>的基础上透明地应用了不同的图像预处理技术,最大化了难度较大图像的解码率。

安装

要安装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的建议)。

使用方法

<a href="https://colab.research.google.com/github/Eric-Canas/QReader/blob/main/example.ipynb" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/09a80407-4e70-4a4e-b2a8-4fc7ad442895.svg" alt="在Colab中打开" data-canonical-src="https://yellow-cdn.veclightyear.com/835a84d5/09a80407-4e70-4a4e-b2a8-4fc7ad442895.svg" style="max-width: 100%;"></a>

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()

<a name="QReader_detect"></a>

QReader.detect(image)

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

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

  • is_bgrboolean。如果为True,则接收的图像预期为_BGR_而不是_RGB_。 <a name="QReader_detect_table"></a>

  • 返回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。你可以直接使用它们进行索引,无需进一步处理。

注意:这是你唯一需要的方法吗?看看<a href="https://github.com/Eric-Canas/qrdet" target="_blank">QRDet</a>

QReader.decode(image, detection_result)

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

内部实现上,该方法将运行 <a href="https://github.com/NaturalHistoryMuseum/pyzbar" target="_blank">pyzbar</a> 解码器,利用 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

使用测试

<div><img alt="test_on_mobile" title="test_on_mobile" src="https://yellow-cdn.veclightyear.com/835a84d5/b3475d94-bf40-44fb-b583-edb7a6c07d05.jpeg" width="60%"><img alt="" title="QReader" src="https://yellow-cdn.veclightyear.com/835a84d5/df77c41b-bc45-4bc4-85a9-4cdf80dde15f.jpeg" width="32%" align="right"></div> <div>两张样例图像。左图是用手机拍摄的图像。右图是贴在绘画上的 64x64 二维码。</div> <br>

以下代码将尝试使用 QReader<a href="https://github.com/NaturalHistoryMuseum/pyzbar" target="_blank">pyzbar</a><a href="https://opencv.org/" target="_blank">OpenCV</a> 解码这些包含二维码的图像。

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 内部使用 <a href="https://github.com/NaturalHistoryMuseum/pyzbar" target="_blank">pyzbar</a> 作为解码器QReader 实现的更高检测-解码率来自于不同图像预处理技术的组合,以及基于 <a href="https://github.com/ultralytics/ultralytics" target="_blank">YOLOv8</a><a href="https://github.com/Eric-Canas/qrdet" target="_blank">二维码检测器</a>,它能够在比传统计算机视觉方法更困难的条件下检测二维码。

运行测试

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

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

然后,你可以运行测试

python -m pytest tests/

基准测试

旋转测试

<div> <img alt="旋转测试" title="旋转测试" src="https://yellow-cdn.veclightyear.com/835a84d5/9a4f4cd2-b7f4-4852-bf6a-8e0c118512af.gif" width="40%" align="left">

                             

<div align="center">
方法最大旋转角度
Pyzbar17º
OpenCV46º
QReader79º
</div> </div>

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多