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. 传统计算机视觉技术落伍了吗?不,它们是深度学习的「新动能」
  2. 配置linux下oracle sqlplus/rman等历史记录回调功能
  3. apache下配置php
  4. java编程50实例_java编程实例大全及详解谜底(50例).doc
  5. 如何在RCP程序中添加一个banner栏
  6. 反思laravel-admin的使用总结
  7. python调用报表制作工具_工作汇报神技!用Python三步生成带有图表的word报表
  8. android 串口一直打开_android 如何打开串口以及与串口通讯
  9. 硬盘温度70度正常吗_读懂固态硬盘:NVMe SSD的SMART健康数据这样看
  10. rdd转换成java数据结构_如何将CSV文件转换为RDD
  11. 牛客网 【每日一题】5月29日 管道取珠
  12. open 端口打开Linux,linux – nmap显示打开的端口,但netstat没有
  13. tableView中deselectRowAtIndexPath的作用
  14. android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术
  15. fseek linux 大文件_上传大文件
  16. OSPF多区域配置实例
  17. 服务器安装esxi系统
  18. 电脑变wifi 用电脑建立无线网
  19. Java之美[从菜鸟到高手演变]之Java学习方法
  20. 大家好,我是数学家!来抢诺贝尔奖了!

热门文章

  1. 什么是功能性测试?-Alltesting|泽众云测试
  2. 在当前目录下 打开cmd
  3. 集合和数组区别_了解您的编码基础:集合和数组之间的主要区别
  4. 大数据给人们生活带来的改变_大数据给我们的生活带来了哪些改变?
  5. 【经典算法题-2】费式数列(Fibonacci数列)
  6. 世界前五大IT咨询公司
  7. 2020.12.28Excel(数字到BZZ)
  8. SpringSecurity自定义多Provider时提示No AuthenticationProvider found for问题的解决方案与原理(四)
  9. Excel的复合条饼图制作
  10. 基于Python的无参考图像质量评价