opencv本身有二维码识别功能,但是识别效果不是很好,它对二维码图片要求较高,虽然可以有图片处理,甚至抠出二维码区域,但是整体识别与微信二维码识别功能还是有差距的。

微信二维码识别,采用了机器学习算法,加入了CNN模型的概念,它作为三方库,开源给了opencv,而且支持java语言,不过要使用,需要结合操作系统做编译,需要下载opencv源码,还需要下载opencv_contrib代码,这里面就是一些三方库,微信二维码就在这里面。

源码编译需要生成opencv_java45x.dll,opencv-java45x.so,opencv_java45x.jar等文件,不仅需要动态库,还需要jar包。

在windows系统下,动态库是dll类型,在linux下动态库就是so类型。如果你能下载到opencv-4.x版本的jar,dll,so文件,可以直接使用,如果没有,就需要手动编译(编译过程非常复杂,建议不要轻易尝试)。

有了jar,动态库,就很方便了,无需很复杂的设置,做过java开发的肯定知道jar需要加入类路径下,动态库只需要指定一个位置,java能像读文件一样加载到就可以了。

这里以windows系统为例,所需的文件就是opencv-453.jar和opencv_java453.dll动态库,如果是maven项目,我们可以将opencv-453.jar作为本地jar加入项目中。

<dependency><groupId>org</groupId><artifactId>opencv</artifactId><version>453</version><scope>system</scope><systemPath>${project.basedir}\src\main\resources\opencvlib\opencv-453.jar</systemPath></dependency>

java代码如下:

package org.example;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.wechat_qrcode.WeChatQRCode;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.net.URL;
import java.util.List;public class WeChatQRCodeTool {private static volatile  WeChatQRCodeTool instance;private static volatile WeChatQRCode detector;private WeChatQRCodeTool(){System.setProperty("java.awt.headless","true");URL url = null;String os = System.getProperty("os.name");if(os.startsWith("Linux")){url = ClassLoader.getSystemResource("opencvlib/libopencv_java452.so");System.load(url.getPath());detector = new org.opencv.wechat_qrcode.WeChatQRCode();}else{url = ClassLoader.getSystemResource("opencvlib/opencv_java452.dll");System.load(url.getPath());ClassLoader cl = WeChatQRCodeTool.class.getClassLoader();URL detectprototxt = cl.getResource("opencvlib/detect.prototxt");URL detectcaffemodel =cl.getResource("opencvlib/detect.caffemodel");URL srprototxt=cl.getResource("opencvlib/sr.prototxt");URL srcaffemodel =cl.getResource("opencvlib/sr.caffemodel");detector = new org.opencv.wechat_qrcode.WeChatQRCode(detectprototxt.getPath().substring(1),detectcaffemodel.getPath().substring(1),srprototxt.getPath().substring(1),srcaffemodel.getPath().substring(1));}}public static WeChatQRCodeTool getInstance(){if(instance==null){synchronized (WeChatQRCodeTool.class){if(instance==null){instance = new WeChatQRCodeTool();}}}return instance;}public static Mat bufImg2Mat(BufferedImage original, int imgType, int matType) {if (original == null) {throw new IllegalArgumentException("original == null");}byte[] pixels = null;// Don't convert if it already has correct typeif (original.getType() != imgType) {// Create a buffered imageBufferedImage image = new BufferedImage(original.getWidth(), original.getHeight(), imgType);// Draw the image onto the new bufferGraphics2D g = image.createGraphics();try {g.setComposite(AlphaComposite.Src);g.drawImage(original, 0, 0, null);pixels = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();} finally {g.dispose();}} else {pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();}Mat mat = Mat.eye(original.getHeight(), original.getWidth(), matType);mat.put(0, 0, pixels);return mat;}public String decode(BufferedImage srcImage) {int cvtype = CvType.CV_8UC3;if(srcImage.getType() == BufferedImage.TYPE_BYTE_GRAY) {cvtype = CvType.CV_8UC1;}Mat image = bufImg2Mat(srcImage, srcImage.getType(), cvtype);List<String> result2 = detector.detectAndDecode(image);if (result2 != null && result2.size() > 0) {return result2.get(0);}return null;}public String decodeQRCodeByPath(String qrCodePath){String qrCodeText = null;try {BufferedImage image = ImageIO.read(new File(qrCodePath));qrCodeText = decode(image);}catch (Exception e){e.printStackTrace();}return qrCodeText;}public static void main(String[] args) {String img = "C:\\Users\\86159\\Pictures\\qr-3.jpg";String result = getInstance().decodeQRCodeByPath(img);System.out.println(result);}
}

示例图片如下:

这个二维码图片,在一个大图中,人眼可以看,但是普通的二维码识别基本不可能识别,但是使用微信二维码识别,没有任何问题。识别结果如下所示:

本人尝试过很多二维码图片,使用微信识别,基本一试一个准,果断放弃com.google.zxing提供的二维码识别功能。

不得不佩服微信二维码识别功能的强大,再回过头来想想,这里面使用了深度学习的内容,比如CNN模型,虽然不懂,感觉已经很厉害了。

本人在尝试过程中,发现,很多文章提到,Java使用微信二维码识别功能,需要下载模型文件,也就是代码中提到的:detect.prototxt,detect.caffemodel,sr.prototxt,sr.caffemodel文件,其实,不用这几个文件,也是可以的。

URL detectprototxt = cl.getResource("opencvlib/detect.prototxt");
URL detectcaffemodel =cl.getResource("opencvlib/detect.caffemodel");
URL srprototxt=cl.getResource("opencvlib/sr.prototxt");
URL srcaffemodel =cl.getResource("opencvlib/sr.caffemodel");
/*
detector = new org.opencv.wechat_qrcode.WeChatQRCode(detectprototxt.getPath().substring(1),detectcaffemodel.getPath().substring(1),srprototxt.getPath().substring(1),srcaffemodel.getPath().substring(1));*/
detector = new org.opencv.wechat_qrcode.WeChatQRCode();

本文写到这里,其实也差不多了,但是这种识别只能在windows下,java开发,尤其是服务端,最后的代码99%都是部署在linux服务器下的,那么,本文介绍的办法无需改动,但是linux环境要求比较特殊。不仅需要opencv-453.jar,opencv_java453.so 文件,动态库在调用的时候,还需要一些其他的opencv依赖,这么一来,还是需要编译opencv+opencv_contrib。

我在尝试部署到linux下发现,如果一个机器编译了so文件,可以复制到其他机器使用,其他机器就不需要编译了,但是这些动态库太多了,还是很麻烦的。

本文代码以及所需资源都在这里:opencvtest: opencv结合微信二维码识别 (gitee.com)

opencv结合微信二维码识别功能实现图片二维码识别相关推荐

  1. 万能码那些功能引人注目(安全扫码专业委员会)

    万能码那些功能引人注目(安全扫码专业委员会) 一码一用的二维码太多了,也很常见,出去买个菜,付钱的时候有商家有收款码:去餐馆吃个饭商家有点餐的二维码,也有最后结账的二维码:和朋友出去玩,手机没有电了, ...

  2. iOS QRcode识别及相册图片二维码读取识别

    对二维码的处理及系统原生API扫描. Zbar扫描和Zing扫描 比较 iOS原生API 系统扫描的效率是最高,反正包括各种你见过的没见过的码,但是有一点我不是很清楚 iOS7 扫描二维码可以,但从相 ...

  3. 图片转成二维码怎么弄?图片二维码的制作方法

    当需要用二维码为载体储存图片时,如何操作才能快速将图片转二维码呢?其实制作二维码的方法非常的简单,只需要通过二维码生成器(免费在线二维码生成器-二维码在线制作-音视频二维码在线生成工具-机智熊二维码) ...

  4. 人脸识别手机端APK分享 | 极速体验人脸识别功能 创建一个简单的人脸识别手机APP程序

    1.前言 虹软公司提供免费离线人脸识别,对于开发者提供了比较友好.完整的可配置demo.但是如需直接体验功能,还是要花一点时间去完成项目编译.配置等一系列工作,对于初学者.不怎么熟悉整个项目的人来说可 ...

  5. python 识别登陆验证码图片(完整代码)_python 识别登录验证码图片功能的实现代码(完整代码)...

    在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记. 首选导入一些用到的库,re.Imag ...

  6. python读取视频流做人脸识别_python实现图片,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = c ...

  7. 【人脸表情识别】基于图片的人脸表情识别,基本概念和数据集

    大家好,欢迎来到我们人脸表情识别的专栏,这是专栏的第一篇文章,今天我们讨论的问题是关于表情识别的基本概念和数据集. 作者&编辑 | Menpinland 在较早之前,有三AI已经有一篇< ...

  8. c#和java部署pytorch同事识别两个图片_身份证OCR识别移动端amp;服务器

    摘要:由Web Service和其相关网站接收客户端上传的需要识别的图片.当Web Service接收到图片后将其转发给调度服务器,由任务调度程序再把识别请求分发给空闲的识别服务器,终由Web Ser ...

  9. c#和java部署pytorch同事识别两个图片_身份证OCR识别移动端服务器

    摘要:由Web Service和其相关网站接收客户端上传的需要识别的图片.当Web Service接收到图片后将其转发给调度服务器,由任务调度程序再把识别请求分发给空闲的识别服务器,终由Web Ser ...

  10. 图片在线转二维码如何操作?图片二维码生成器如何使用?

    当我们想要将几张照片做成二维码时,一般都会从网上找相关的二维码制作工具来处理,使用专业的二维码生成器操作更加的简单快捷,而且展现出的效果也比较好.那么下面就让小编来给大家分享一款免费图片转二维码工具, ...

最新文章

  1. mysql optimize_真正实现千人千面?教你用Optimize收割精准流量
  2. UDP实现全双工聊天(聊天工具进阶)pyhton
  3. 【干货分享】如何应对线上数据库的误操作
  4. 为什么发了个博客分分钟被各种网站花式转载=。=而不通知我
  5. ubuntu16下vue-cli安装
  6. 文末赠书100本 | 当下最火爆的机器学习算法
  7. 推荐两款工具给爱做实验的人
  8. 我的docker随笔15:MySQL启动时自动创建数据库
  9. please select a vaild python interpret
  10. 海洋表面洋流数据可视化
  11. 现代电商会员管理新玩法——付费会员
  12. 笔记本找不到WiFi
  13. 猿创征文|OneOS 万耦启物TB6612驱动电机
  14. 韩信点兵算法——c语言实现
  15. 职业规划-签了工作才后悔的职业指导
  16. Windows Server 2012 R2部署OWA服务(三)安装部署OWA服务
  17. Python——检查 JSON 字符串格式错误的位置
  18. 基于单片机十字路口交通灯系统(含原理图)-资料
  19. linux动态桌面插件,Ubuntu下使用动画壁纸 LiveWallpaper 0.3
  20. 谁是幕后英雄?笔记本代工关系大揭秘

热门文章

  1. Android常用的工具方法
  2. APP 兼容性测试是什么?8年测试老鸟告诉你
  3. IPFS BZZ Chia,项目这么多,怎么选择?
  4. MySQL的开发技巧2
  5. MySQl 5.7版本的Data文件夹,my.ini文件,Uploads文件夹所在目录
  6. ubuntu16.04+VScode+C/C++编译器常用插件
  7. 前后端交互过程、常见软件架构、服务器分类
  8. 开源网络负载测试工具测评
  9. 移动光猫怎么设置虚拟服务器设置,移动光纤猫如何设置,怎样连接和设置光猫和路由器...
  10. case 书写的要求与思路