2011年12月微信3.5版本正式上线“扫一扫”二维码,历经9年蜕变,“扫一扫”从二维码名片到扫码支付、从小程序码到健康码,二维码已经成为一种生活方式,连接着数字与现实。

现在,在腾讯WeChatCV团队的贡献下,微信扫码引擎正式加入OpenCV开源了!只需3行代码,你便轻松拥有微信的扫码能力:

import cv2detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
img = cv2.imread("img.jpg")
res, points = detector.detectAndDecode(img)print(res, points)

微信扫码引擎收录于:

opencv_contrib/modules/wechat_qrcode

开发文档:

https://docs.opencv.org/master/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html

微信扫码引擎是一款基于开源引擎ZXing,并高度优化和深度改造的高性能轻量二维码识别器。

1. 基于CNN的二维码检测

“一图多码”是扫码支付经常遇到的线下场景。早在2016年,微信扫码引擎在业内率先支持远距离二维码检测、自动调焦定位、多码检测识别。然而,传统方法需要牺牲40%以上的性能来支持多码的检测与识别。伴随着深度学习技术的成熟和移动端计算能力的提升,微信扫码引擎引入基于CNN的二维码检测器解决上述问题。

图1 二维码检测器

我们以SSD框架为基础,构造了短小精干的二维码检测器(图1),采用残差连接(Residual Concat)、深度卷积(Depthwise Convolution)、空洞卷积(Dilated Convolution)、卷积投影(Convolution Projection)等技术进行了针对性的优化。整个模型大小仅943KB,iPhone7(A10)单CPU的推理时间仅需20ms,很好地满足“低延时、小体积、高召回”的业务需求。

检测代码:

https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L156

模型文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.prototxt

参数文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.caffemodel

2. 基于CNN的二维码增强

大图小码”是远距扫码和长按识码经常面临的难点,二维码增强技术可以让小码更加清晰。2014年,微信率先在对话中上线“识别图中二维码”能力,离不开增强技术的加持。在长按识别的场景中,二维码图像经过用户的裁剪、压缩、转发,图像质量严重受损,分辨率急剧下降,边缘变得模糊不清,这给扫码引擎的识别带来了极大的挑战。

传统图像增强算法很难完美地解决以上问题,因此微信扫码引擎率先在识别流程中引入了基于深度学习的超分辨率技术(图2)。在网络结构上,密集连接(Dense Concat)、深度卷积(Depthwise Convolution)、反向卷积(Deconvolution)、残差学习(Residual Learning)等技术改善模型的性能;在目标函数上,针对二维码强边缘和二值化的特点,结合L2/L1损失、边界加权、二值约束设计了针对二维码的目标函数。经过精心的调优,超分辨率模型大小仅23KB,在iPhone7(A10)单CPU的推理时间仅需6ms(100x100超分200x200),完全满足移动端的应用需求。

图2 二维码超分辨率

超分代码:https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L68

模型文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.prototxt

参数文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.caffemodel

3. 更鲁棒的定位点检测

二维码在识别的时候,通常需要根据扫描像素行/列匹配对应比例来寻找定位点(图3)。

图3 二维码定位点

在定位点检测上,我们提出面积法的定位点检测方法,相比于传统扫描线方法更为鲁棒和高效,有效地避免了误召回和漏召回;在定位点匹配上,特征聚类方法使得扫码引擎可以高效和准确地匹配多个定位点;在图像二值化上,引入多种更为鲁棒的二值化方法,有效地提高解码的成功率。

核心代码:

https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L117

结合传统计算机视觉和深度学习技术,微信扫码引擎解决了一图多码、大图小码、鲁棒解码等业务痛点和技术难点。如今,该引擎在OpenCV上正式开源,期待广大开发者与我们一同打造业内领先的扫码引擎!

基于CNN的微信二维码引擎OpenCV开源!相关推荐

  1. 重磅!微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 本文转载自:OpenCV团队 2011年12月微信3.5版本正式上线"扫一扫&quo ...

  2. 微信二维码引擎OpenCV开源

    zxing:jni方式调用: https://github.com/devilsen/CZXing android studio4.1 十天前,微信官方开发团队在 opencv_contrib 开源了 ...

  3. 全网首发微信二维码引擎Android平台移植

    2011年12月微信3.5版本正式上线"扫一扫"二维码,历经9年蜕变,"扫一扫"从二维码名片到扫码支付.从小程序码到健康码,二维码已经成为一种生活方式,连接着数 ...

  4. 使用 OpenCV + 微信二维码引擎实现二维码识别

    Part1背景 今年自疫情以来,我都没有写过文章.一方面是疫情导致居家办公比较烦躁,另一方面最近有点懒了.但是工作还是要继续,趁这几天优化了一下最近的项目,我整理了一下如何使用 OpenCV 和微信二 ...

  5. opencv微信二维码引擎的使用(for java)

    前面讲了windows系统下opencv+opencv的编译方法,编译方法和编译好的文件如下: Windows下联合编译opencv+opencv_contrib微信二维码引擎 OpenCV4.5.2 ...

  6. 微信闪退Bug罪魁祸首竟是二维码引擎,附源代码分析

    建议别尝试:转发这个二维码到群里,3秒后你会回来骂我(抖m求骂) 近日,网传微信识别上方二维码就会出现闪退BUG,小编也忍不住尝试了一下,果然,一识别该二维码微信立马就出现了闪退的现象: 且会出现&q ...

  7. Java使用opencv调用微信扫描二维码引擎,附带windows和linux需要的动态库文件

    前言 最近公司项目有一个需求,要用二维码传递数据.于是使用了zxing生成和解析二维码,但是zxing扫描二维码原图还可以,一旦扫描用户使用手机拍摄的二维码,识别率急剧下降.尝试了对拍摄的照片进行降噪 ...

  8. 每年扫码千亿次!微信官方开源了自家优化的二维码引擎!3行代码让你拥有微信扫码能力...

    本文转载自OpenCV团队. 十天前,微信官方开发团队在 opencv_contrib 开源了自家优化9年的二维码引擎!各位读者可编译最新版OpenCV及opencv_contrib ,直接使用! 2 ...

  9. 基于zxing的仿微信二维码扫描界面

    基于zxing的仿微信二维码扫描界面 https://github.com/iamlocky/ZxingLite 本项目fork自yangxixi88/ZxingLite,在原项目基础上添加了本地图片 ...

最新文章

  1. linux sort 排序命令简介
  2. sam格式的结构和意义_SAM格式的学习
  3. boost::coroutine模块实现不对称链的测试程序
  4. 开源 一套 Blazor Server 端精致套件
  5. java 线程池 资源回收_JAVA线程池资源回收的问题
  6. 信息: 开始协议处理句柄[http-nio-8080]_你必须要知道的HTTP协议原理
  7. 随想录(最简单的windows图形编程之Easyx)
  8. MySQL数据库与Oracle数据库中建表使用单引号和双引号的效果
  9. 《混合云计算》——2.3 整合势在必行
  10. java做图形界面计算n_n皇后问题回溯法---java图形界面实现回溯过程
  11. java 8 64位官方下载_Java 8下载 Java 8.0U181官方正式版(32位/64位) 下载-脚本之家
  12. 在Windows环境下,将tomcat的默认端口修改为8081
  13. 大一java计算圆面积_Java练习题——计算圆的面积
  14. 虚拟串口软件VSPD下载安装及使用 包含XCOM串口调试软件
  15. 高一被清华姚班录取,高三委拒谷歌 offer,一个重度网瘾少年到理论计算机科学家的蜕变!...
  16. Python-正则表达式
  17. jQuery CSS3中国象棋网页代码
  18. generator详解
  19. 计算机分析建筑风,武汉城住宅小区风环境计算机模拟分析-图学学报.PDF
  20. Brocade 300 FC交换机收集诊断日志

热门文章

  1. Andro Studio 基于Zing一维码二维码扫描代码
  2. Hinton最新演讲!一种新神经网络:前向-前向FF算法,论文已公开!
  3. Excel/Word 插入图表 InvokeMember设置图表类型
  4. synctoy 远程同步_使用SyncToy将任何文件夹同步到Dropbox
  5. You must restart adb and Eclipse处理方法(sjk_daemon.exe占用5037端口)
  6. “特质波动率之谜”(Idiosyncratic Volatility),用Python计算特质波动率
  7. OpenCvSharp N幅图片叠加成一张图片
  8. 假如生活欺骗了你 (普希金诗歌)
  9. PMP备考大全:经典题库(8月第4周)
  10. 线程状态转换图及其5种状态切换