高效稳定的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º |
AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。
一站式AI创作平台
提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作
AI办公助手,复杂任务高效处理
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号