
高效稳定的Python QR码识别库
QReader是一个基于YOLOv8的Python库,专门用于识别和解码复杂场景中的QR码。该库集成了先进的QR码检测模型和图像预处理技术,能够在旋转、低分辨率等困难条件下保持较高的识别率。相较于传统方法,QReader表现更为稳定,为开发者提供了可靠的QR码读取解决方案。
<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之前安装PyTorch的CPU版本。要做到这一点,运行: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被检测到但无法解码时。
这是库的主类。请尽量只实例化一次,以避免每次需要检测QR码时都加载模型。
model_size:str。要使用的模型大小。可以是**'n'(nano)、's'(small)、'm'(medium)或'l'(large)。较大的模型可能更准确但速度较慢。推荐:'s'**(#37)。默认:'s'。min_confidence:float。QR检测被认为有效的最小置信度。接近0.0的值可能会得到更多_假阳性_,而接近1.0的值可能会丢失难以识别的QR。默认(并推荐):0.5。reencode_to:str | None。用于重新编码utf-8解码后的QR字符串的编码。如果为None,则不会重新编码。如果发现某些字符解码不正确,可以尝试设置与你特定字符集匹配的代码页。已发现有用的建议:
weights_folder:str|None。检测模型将被下载的文件夹。如果为None,它将被下载到默认的qrdet包内部文件夹,确保在卸载时正确删除。在像AWS Lambda这样只有/tmp文件夹可写的环境中工作时,你可能需要更改它,如#21中所述。默认:None(<qrdet_package>/.model)。此方法将解码给定图像中的QR码,并返回解码后的_字符串_(如果检测到但未解码,则返回_None_)。
image:np.ndarray。要读取的图像。预期为_RGB_或_BGR_(uint8)格式(HxWx3)。
return_detections:bool。如果为True,将返回完整的检测结果以及解码后的QR。如果为False,则只返回QR码的解码内容。
is_bgr:boolean。如果为True,则接收的图像预期为_BGR_而不是_RGB_。
返回:tuple[str | None] | tuple[tuple[dict[str, np.ndarray | float | tuple[float | int, float | int]]], str | None]]:一个包含所有检测到的QR码解码结果的元组。如果return_detections为False,输出将如下所示:('解码QR 1', '解码QR 2', None, '解码QR 4', ...)。如果return_detections为True,则如下所示:(('解码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>
此方法检测图像中的QR码,并返回包含所有检测信息的_字典元组_。
image:np.ndarray。要读取的图像。预期为_RGB_或_BGR_(uint8)格式(HxWx3)。
is_bgr:boolean。如果为True,则接收的图像预期为_BGR_而不是_RGB_。
<a name="QReader_detect_table"></a>
返回:tuple[dict[str, np.ndarray|float|tuple[float|int, float|int]]]。包含每个检测的所有信息的字典元组。包含以下键。
| 键 | 值描述 | 值类型 | 值形式 |
|---|---|---|---|
confidence | 检测置信度 | float | conf. |
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_xy的quad_xy | np.ndarray (4, 2) | [[x1, y1], ..., [x4, y4]] |
image_shape | 输入图像的形状 | tuple[int, int] | (h, w) |
注意:
- 所有
np.ndarray值的类型为np.float32- 除
confidence和image_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>。
此方法根据给定的检测结果解码图像上的单个二维码。
内部实现上,该方法将运行 <a href="https://github.com/NaturalHistoryMuseum/pyzbar" target="_blank">pyzbar</a> 解码器, 利用 detection_result 的信息,应用不同的图像预处理技术,大大提高解码成功率。
image:np.ndarray。包含要解码的二维码的图像的 NumPy 数组。图像应为 uint8 格式 [HxWxC],RGB。
detection_result:dict[str, np.ndarray|float|tuple[float|int, float|int]]。detect 方法返回的检测字典之一。注意,QReader.detect() 返回这些字典的 tuple。此方法只需要其中一个。
返回值:str | None。二维码的解码内容,如果无法读取则返回 None。
以下代码将尝试使用 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 align="center">
| 方法 | 最大旋转角度 |
|---|---|
| Pyzbar | 17º |
| OpenCV | 46º |
| QReader | 79º |


GPT充值
支持 ChatGPT Plus / Pro 充值服务,支付便捷,自动发货,售后可查。


AI 图片生成平台
GPT Image 2 是面向用户的 AI 图片生成平台,支持文生图、图生图及多模型创意工作流。


你的AI Agent团队
Vecbase 是专为 AI 团队打造的智能工作空间,将数据管理、模型协作与知识沉淀整合于一处。算法、产品与业务在同一平台无缝协同,让从数据到 AI 应用的落地更快一步。


全球首个AI音乐社区
音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。


阿里Qoder团队推出的桌面端AI智能体
QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。


一站式搞定所有学习需求
不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。


为AI短剧协作而生
专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。


能听懂你表达的视频模型
Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。


国内直接访问,限时3折
输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动


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

微信扫一扫关注公众号