目标检测:二维码检测方案
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
一、序
移动互联网时代,我们的身边,无处不见的二维码,在商店买东西可以用微信或支付宝的付款码、在电影院可以使用二维码在自助取票机上取票,朋友聚会时使用微信二维码互相加好友。移动终端设备的普及,出门只需要携带一步手机,极大方便了人们的日常生活。从技术的角度观察,很多场景下,二维码包含的都是一个 HTTP 链接,手机扫码识别出二维码的内容,然后跳转到对应的网站。就好比 PC 终端上,访问一个网站,一般的流程是,用户在浏览器 “地址栏” 输入一个网址,然后回车确认,浏览器就会跳到对应的网站。而二维码的流行,改变了这个交互流程,由手机 “扫一扫” 拍摄二维码照片,然后手机内部解码照片,提取二维码包含的 HTTP 链接,最后跳转对应的网站。简言之,通过手机扫码代替了用户手动输入网址的过程。
二、浅析二维码原理
维基百科:二维码也称为二维条码,是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。
一个普通二维码的基本结构:
- Position Detection Pattern:位置探测图形(这样无论二维码旋转任意角度,都可以通过定位图案识别出来);
- Separators for Postion Detection Patterns:位置探测图形分割符;
- Timing Patterns:定位图形,原因是二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪了;
- Alignment Patterns:校正图形,规格确定,校正图形的数量和位置也就确定了;
- Format Information:格式信息,存在于所有的尺寸中,用于存放一些格式化数据的;
- Version Information:即二维码的规格,QR 码符号共有40种规格的矩阵;
- Data and Error Correction Codewords:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。
有了这个基本结构之后,画二维码图,就是使用一定的编码格式对数据进行编码,然后填充到相应的网格区域,最后输出二维码图片。详细的二维码生成细节和原理,可以看耗子叔这篇文章:https://coolshell.cn/articles/10590.html
三、二维码识别
一般场景下,移动端 APP 扫码的解析工作都在移动端设备上完成,在 Android 中二维码扫描的最常用库是 zxing 和 zbar。
如果想在 Python 中编写识别二维码的程序,同样也可以 zxing 库:
# 安装依赖库
pip3 install zxing
下面的试验,左图是一张没有背景干扰的图片,右图是一张有背景干扰的图片,同样使用 zxing 库来检测二维码:
具体的代码实现:
import zxingreader = zxing.BarCodeRead
barcode = reader.decode("/User/xxx/origin.jpg")
print(barcode.parsed) # output: 二维码内容
其中,左图识别输出 https://cli.im/
,右图识别输出:https://github.com
上面的识别的结果都是对的,但是速度很慢,在 “双核四线程” 机器上,耗时都在 2 ~ 3s 之间。那么,该如何提升二维码探测的速度?
OpenCV
通过查资料,找到了 OpenCV 库,在对象检测模块中QRCodeDetector 有两个相关 API 分别实现二维码检测与二维码解析。
# 安装依赖
pip3 install opencv-contrib-python
具体的 Python 代码实现:
import cv2
import sys
import timeimg = cv2.imread(infile)
qr = cv2.QRCodeDetector()
result, points, code = qr.detectAndDecode(img)
print("The result: ", result) # result 是二维码内容
print("The points: ", points) # points 是二维码在图片中的坐标
同样使用上面的两张图片进行测试:
在同样的开发设备上,可以看到二维码的探测速度 OpenCV 比 zxing 快了 2 个数量级,但是,当解析有背景干扰的图片时,无法探测出二维码内容。
这里引起了一个问题,***如何在有复杂背景下的图片中识别出二维码?***比如下面这样的图片:
3.目标检测模型
目标检测,object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。
图片来自:https://github.com/aloyschen/tensorflow-yolo3
在这里,我没有深入研究 ”目标检测模型“ ,只是简单使用了 yolov3 图像识别框架跑了 demo。
yolov3 检测分两步:
- 确定检测对象位置
- 对检测对象分类(是什么东西)
即在识别图片是什么的基础上,还需定位识别对象的位置,并框出。
下面是 darknet + yolov3 的环境安装流程:
- 安装 darknet
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
- 使用预先训练模型测试
# 下载预训练权重
wget https://pjreddie.com/media/files/yolov3.weights# 运行命令检测,没有使用gpu所以时间有点长
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
yolov3 预训练模型,仅支持识别图像中一部分物品,不能识别出图像中的 ”二维码“。如果想要识别出二维码,需要制作训练数据集然后训练模型。
- 制作训练数据集
- 收集图片
- 深度网络训练的数据集做标注,makesense.ai 是可免费使用的用于为照片加标签的在线工具。
- 视频教程 P9:https://www.bilibili.com/video/BV1Hp4y1y788?p=9
- 训练集
- 测试集
- 验证集
- 训练目标检测模型
- 准备数据集(标注数据)
- 下载预训练权重:wget https://pjreddie.com/media/files/yolov3.weights
- 配置 YOLO
- 训练模型
- 使用模型
另一方面,如果采用 yolov3 进行图片中二维码探测,将需要大量的数据集,人工手动的二维码标注,还需要具备 GPU 的机器来跑训练集,这将是一个工作量巨大且耗时漫长的过程。该如何解决训练模型的问题?
微信二维码引擎 OpenCV 开源
开源世界总会给人惊喜,微信二维码引擎居然也开源,文档地址:https://mp.weixin.qq.com/s/pphBiEX099ZkDV0hWwnbhw
按照文章的代码实现:
import cv2# 探测二维码
detect_obj = cv2.wechat_qrcode_WeChatQRCode('detect.prototxt', 'detect.caffemodel', 'sr.prototxt', 'sr.caffemodel')
img = cv2.imread(infile)
res, points = detect_obj.detectAndDecode(img)# 绘制框线
for pos in points:color = (0, 0, 255)thick = 3for p in [(0, 1), (1, 2), (2, 3), (3, 0)]:start = int(pos[p[0]][0]), int(pos[p[0]][1])end = int(pos[p[1]][0]), int(pos[p[1]][1])cv2.line(img, start, end, color, thick)
cv2.imshow('img', img)
cv2.imwrite('wechat-qrcode-detect.jpg', img)
二维码探测,输出结果:
上述图片的二维码探测,结果是准确的,耗时却是惊人的(注意:这是没有绘制框线的耗时)
基于 CNN 的二维码检测
“一图多码” 是扫码支付经常遇到的线下场景。早在2016年,微信扫码引擎在业内率先支持远距离二维码检测、自动调焦定位、多码检测识别。然而,传统方法需要牺牲40%以上的性能来支持多码的检测与识别。伴随着深度学习技术的成熟和移动端计算能力的提升,微信扫码引擎引入基于 CNN 的二维码检测器解决上述问题。
以 SSD 框架为基础,构造了短小精干的二维码检测器,采用残差连接(Residual Concat)、深度卷积(Depthwise Convolution)、空洞卷积(Dilated Convolution)、卷积投影(Convolution Projection)等技术进行了针对性的优化。整个模型大小仅943KB,iPhone7(A10)单 CPU 的推理时间仅需20ms,很好地满足“低延时、小体积、高召回”的业务需求。
四、识别一图多码
上面提到,开源的微信二维码引擎 OpenCV 很好的解决了复杂背景图的二维码识别问题,而且同时具备超高的性能,极短的耗时。
针对文章提到的一图多码的场景,我们进行验证,发现在验证过程中,一图多码的识别效果并没有预期的那么理想。
使用 微信二维码引擎 OpenCV 探测一张包含多个二维码的图片时,会出现二维码识别不全的问题。通过试验,将图片切割成多个小图片,每张切片包含若干个二维码时,验证后发现识别效果最好的是一张图片包含一个二维码。因此产生下列的 ”滑动窗口单图多二维码” 探测方案。
滑动窗口一图多码方案
窗口滑动原理:
- 第一次滑动:检测不到二维码,左边界不动右边界右移动,扩大窗口
- 第二次滑动:检测不到二维码,左边界不动右边界右移动,扩大窗口
- 第三次滑动:检测到二维码,左边界移动到右边界重合,窗口大小归 0
- 第四次滑动:检测不到二维码,左边界不动右边界右移动,扩大窗口
- 第五次滑动:检测到二维码,左边界移动到右边界重合,窗口大小归 0
后续的步骤同理,直到将右边界移动到了图片的最右端,代表探测结束。
最后,采用 ”滑动窗口一图多码探测” 方案的效果图,准确度还是非常高的:
当然,这里只是简单的演示,里面还有很多问题,比如:这种方案仅适合二维码横向排列的场景,如果同一个列有多张二维码,就可以被裁剪掉。
have fun!
五、参考文献
- 二维码的生成细节和原理:https://coolshell.cn/articles/10590.html
- OpenCV QR Code Scanner ( C++ and Python ):https://learnopencv.com/opencv-qr-code-scanner-c-and-python/
- Python识别复杂背景下的二维码:https://www.jianshu.com/p/743326c41b64
- 微信二维码引擎 OpenCV 开源:https://mp.weixin.qq.com/s/pphBiEX099ZkDV0hWwnbhw
目标检测:二维码检测方案相关推荐
- Jetson Nano 从入门到实战(转载)(案例:Opencv配置、人脸检测、二维码检测)
目录 1. Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 ...
- Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)
目录 1. Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 ...
- 【深度学习】【caffe】【python】【docker】微信 二维码检测,手写数字识别
文章目录 介绍 docker环境 MNIST 数据(废弃) 微信二维码 微信二维码 python代码试试 用于造yolov5的目标检测数据 了解caffe,使用caffe,做个小例子熟悉caffe. ...
- OpenCV4.0 快速QR二维码检测测试示例
点击我爱计算机视觉标星,更快获取CVML新技术 近几年由于微信大力推广移动支付,二维码已经成为手机App的标配,在众多种类的二维码中,QR码是最为流行的. 刚刚发布的OpenCV4.0-Alpha新增 ...
- python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容
python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容 1 pyzbar二维码检测模块 1.1. pyzbar模块介绍 1.2 pyzbar ...
- OpenCV C++案例实战三《二维码检测》
OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...
- 【写着玩】二维码检测及定位
文章目录 基于轮廓嵌套的识别方法 OpenCV 中的 QRCodeDetector 最近在B站上看到了 PaperClip 关于二维码的视频,主要讲的是二维码中的纠错码.但是在读取二维码内容前需要先定 ...
- OpenCV4学习笔记(58)——二维码检测与识别
本次要整理的笔记内容是在OpenCV中对二维码进行检测与识别.二维码对我们来说可以说是非常熟悉的,乃至于每次出门都会和"扫码"挂钩,可以说二维码已经渗入到我们生活的方方面面.那么二 ...
- Opencv之微信二维码检测与解析
简介 微信二维码检测器是由微信计算机视觉团队(WeChatCV)提供的一个高性能.轻量级的二维码检测与解码库.它已广泛应用于腾讯的各种应用,包括微信.微信.QQ.QQ浏览器等.微信二维码检测仪有四个主 ...
最新文章
- POJ2391(最大流Isap+Floyd+二分)
- 《你必须知道的495个C语言问题》知识笔记及补充
- 安卓开发环境搭建(转)
- codeforces:CF750 复盘
- 用Web Developer工具栏发现SEO问题的方法
- 2019计算机科学与技术考研分数线,2019考研中国科学技术大学复试分数线已公布...
- python安装sql模块_在Python安装MySQL支持模块的方法
- linux在多核处理器上的负载均衡原理(2)
- [练习]QQ登陆界面-测试用例的编写
- 你有必要不沾计算机一段时间英语,2016新目标八年级英语下全册重点总结.docx
- 计算机的数学知识的手抄报图片大全,数学知识手抄报图片大全
- 开发Android系统应用
- springBoot学习(二)配置环境动态切换和部分注解的运用
- Android 真正的3D Gallery
- Windows 10 l2tp ^PN 无法连接
- 【面试】Java中级工程师社招简历
- Excel表格打开出现“文件已损坏,无法打开”
- 函数极限概念 极限的性质 极限存在准则 无穷大及无穷小
- 【获得学位条件】绩点计算与要求
- poj 2923(状态压缩+背包)
热门文章
- 爬取电影天堂最新电影的名称和下载链接
- Java设计模式全集-工厂模式系列(Factories)
- 鸿蒙系统支持名单,12月支持鸿蒙系统的机型名单!想尝鲜的可以注意了!
- 新路由3 H大老毛子,2月20日padavan固件
- 解决网页无法复制文字
- mc服务器怎么修改浮空字,如何制作悬浮字?我的世界教程 | 我的世界 | MC世界侠...
- 小红书种草笔记怎么写?种草笔记标题怎么写比较好
- 低效能程序员的行为与思维
- Hello 内存 cache 主存 外存
- 【底层思维】思维的深度决定人生的高度,底层思维的4个方法论