以下文章来源于ALL程序猿,作者ALL程序猿
本文旨在分享编程、IT和爬虫相关知识,仅供学习和参考之用。读者在使用本文提供的信息和代码时,应该在合法范围内遵守相关法律法规,并对其行为负全部责任。作者和本公众号力求提供准确和可靠的信息,但不对信息的准确性、完整性、实时性或适用性作出任何明示或暗示的陈述或保证。阅读者在使用本文提供的代码和技术时,应该谨慎行事,并在实际应用中进行适当的测试和验证。对于因使用本文信息而引起的任何损失,作者和本公众号概不负责。感谢您的理解与支持。文章如有不当可联系删除!
经常需要识别二维码,例如用于文件录入、药品追溯、发票校验等场景。一开始,尝试使用pyzbar,但测试后发现其对中文二维码的支持非常有限——要么乱码,要么识别失败,体验极差。
为此,开始寻找更强大的替代方案,最终选定了由微信团队贡献给 OpenCV 的wechat_qrcode模块。它结合了二维码检测与超分辨率增强模型,识别率高,抗干扰能力强,尤其适合复杂背景下的二维码识别任务。
一、环境依赖
Python 3.x
OpenCV ≥ 4.5(需包含wechat_qrcode模块)
安装命令如下:
pip install opencv-contrib-python
注意:必须安装opencv-contrib-python,而不是opencv-python,因为wechat_qrcode模块仅包含在 contrib 包中。
二、模型文件准备
要启用WeChatQRCode模块,需要下载以下四个模型文件:
detect.prototxt
detect.caffemodel
sr.prototxt
sr.caffemodel
请前往微信官方 GitHub 仓库下载,并将其放置于你的脚本目录中:
下载地址:https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode
三、二维码识别核心代码
import cv2
def detect_qrcode(image_path):
# 初始化 WeChat QRCode 检测器
try:
detector = cv2.wechat_qrcode_WeChatQRCode(
"detect.prototxt",
"detect.caffemodel",
"sr.prototxt",
"sr.caffemodel"
)
except Exception as e:
print("初始化 WeChatQRCode 失败")
print("请确认模型文件已正确放置到脚本目录中")
return []
# 读取图像并进行亮度与对比度增强
img = cv2.imread(image_path)
if img isNone:
print(f"无法读取图片: {image_path}")
return []
img = cv2.convertScaleAbs(img, alpha=1.2, beta=40)
# 检测并解码二维码
results, _ = detector.detectAndDecode(img)
return [res for res in results if res]
img = cv2.convertScaleAbs(img, alpha=1.2, beta=40)
四、运行示例
if __name__ == "__main__":
image_path = "your_image.jpg" # 替换为你的图片路径
qrcodes = detect_qrcode(image_path)
if qrcodes:
print("识别到的二维码内容:")
for i, content in enumerate(qrcodes, 1):
print(f"{i}. {content}")
else:
print("未识别到二维码")