微信二维码扫描器是一个基于卷积神经网络 (CNN) 的库,用于检测和解码二维码。顾名思义,它是由微信计算机视觉团队开发和贡献的。它通过opencv-contrib包中的 4.5.2 版集成到 OpenCV 中,我们的代码需要安装opencv 4.5.2 与opencv-contrib 4.5.2 以上版本,当然opencv也有自己的二维码识别器,我们来看看识别的对比效果
二维码的结构
二维码主要包含5个参数:
位置
Timing
纠错级别
Mask图案
格式纠错
包含较小方块的独特黑色方块是帮助确定二维码位置和旋转的跟踪框。Timing(重复位置框之间的黑色和白色图案)提供了有关QR码的大小的信息。有基于所述40种不同类型的QR码Timing。版本 1(21×21 盒)、版本 2(25×25)、版本 3(29×29)至版本 40(177×177)。纠错级别说明可以恢复的数据字节的百分比。根据纠错的级别,可以有 4 个不同的类别。低 (7%)、中 (15%)、四分位 (25%) 和高 (30%)。级别越高,存储容量就越低。扫描仪借助这些参数检测二维码并解码数据。
关于二维码的参数,我们不做详细的说明,本期代码我们要安装opencv 4.5.2 与opencv-contrib 4.5.2 以上版本,微信二维码需要下载其神经网络的模型,目前最新的版本4.5.4.60
opencv 二维码识别
opencv主要有detect与decode2个函数进行二维码的识别与检测,opencv把此2个函数合并在一起,可以使用detectAndDecode函数来进行图片二维码的检测
# 检测二维码
bool cv::QRCodeDetector::detect(
InputArray img,
OutputArray points
)const
img输入图像,灰度或者彩色图像
points 得到的二维码四个点的坐标信息
# 解析二维码
std::string cv::QRCodeDetector::decode(
InputArray img,
InputArray points,
OutputArray straight_qrcode = noArray()
img输入图像,灰度或者彩色图像
points 二维码ROI最小外接矩形顶点坐标
qrcode 输出的是二维码区域ROI图像信息
返回的二维码utf-8字符串
上述两个API功能,可以通过一个API调用实现,该API如下:
std::string cv::QRCodeDetector::detectAndDecode(
InputArray img,
OutputArray points = noArray(),
OutputArray straight_qrcode = noArray()
在运行此代码前,需要安装opencv 4.5.2 与opencv-contrib,目前版本4.5.4.60
安装完成后,插入如下代码:
import cv2
import numpy as np
detector = cv2.QRCodeDetector()
img = cv2.imread("1.jpg")
res, points,code = detector.detectAndDecode(img)
cv2.drawContours(img,[np.int32(points)],0,(0,0,255),2)
print(res, points,code)
cv2.imshow('img',img)
cv2.waitKey(0)
首先我们直接使用cv2.QRCodeDetector函数搭建一个detector检测器,然后读取一张照片使用detectAndDecode子函数进行二维码的检测与识别,此函数返回三个参数
rets是二维码信息,points是二维码的4个位置点,code是二维码编码
识别完成后,我们打印其输出log,并使用drawContours函数进行图片的位置备注
http://weixin.qq.com/r/3hMRCUnEdBQLrQ1q90bM [[[369. 183.]
[506. 183.]
[506. 323.]
[369. 323.]]] [[ 0 0 0 ... 0 0 0]
[ 0 255 255 ... 255 255 0]
[ 0 255 0 ... 0 255 0]
[ 0 255 0 ... 255 0 0]
[ 0 255 255 ... 255 255 255]
[ 0 0 0 ... 255 255 0]]
我们把二维码遮挡一部分,然后看看opencv的识别效果,可以看出opencv只是识别出来了二维码,但并没有输出信息
[[[369. 183.]
微信二维码检测器
[506. 183.]
[506. 323.]
[369. 323.]]] None
二维码的普及应该在微信的使用后,微信也发布了自己的二维码识别系统
微信二维码扫描器内部使用了两种CNN模型。
检测器模型:此 CNN 模型用于定位二维码。
超分辨率模型:用于提高图像分辨率的一类技术称为超分辨率技术。微信二维码扫描器采用超分辨率模式,提升二维码分辨率。因此,当 QR 码的分辨率较小时(例如,当您从远处扫描时),它能够提供出色的结果。
这两个 CNN 模型采用 Caffe 深度学习框架格式,由两个文件组成——
模型架构文件(“model.prototxt”)
模型权重文件(“model.caffemodel”)包含在训练过程中学习到的权重和偏差。
import cv2
import numpy as np
detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
img = cv2.imread("1.jpg")
res, points = detector.detectAndDecode(img)
cv2.drawContours(img,[np.int32(points)],0,(0,0,255),2)
print(res, points)
cv2.imshow('img',img)
cv2.waitKey(0)
微信二维码检测器使用神经网络来识别,模型主要包括CNN模型,以及SR高分辨率模型
我们使用
cv2.wechat_qrcode_WeChatQRCode函数来建立一个二维码检测器,然后使用detectAndDecode函数对二维码进行检测与识别
输出结果:('http://weixin.qq.com/r/3hMRCUnEdBQLrQ1q90bM',) (array([[370.18054, 180.97406],
[506.73303, 180.97406],
[506.73303, 321.71262],
[370.18054, 321.71262]], dtype=float32),)
利用同一张遮挡照片,我们使用微信识别系统看看识别效果
('http://weixin.qq.com/r/3hMRCUnEdBQLrQ1q90bM',) (array([[370.84125, 180.39166],
[508.94144, 180.39166],
[508.94144, 321.98196],
[370.84125, 321.98196]], dtype=float32),)
可以看出,微信检测二维码可以正常地识别出二维码信息
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.