java-opencv体验微信二维码检测解码

前言

二维码的使用无处不在,掏出手机扫一扫。opencv_contrib是作为opencv的扩展模块独立存在的,这里面有包含一些新的算法或者有专利的。腾讯WeChatCV团队贡献了wechat_qrcode模块。因为是在扩展模块所以需要自己手动编译把扩展模块加载进去。网上看到的是腾讯的二维码识别效率非常高,自己编译使用可以轻松拥有微信扫码般的功能体验。

win下opencv编译

  1. 工具就是cmake和Visual studio;编译很简单跟着教程安装工具跟着配置走就行了。
  2. 网上教程很多,我参考的是这篇
  3. 基础包在github上下就可以了。注意版本要一致。opecv下载opencv_contrib下载
  4. github网络是要通的的,因为一些依赖需要从这里下的;
  5. 文件路径要用英文的,不然会有些问题。用工具有时想用个中文的文件名感觉经常会遇到文件路径识别乱码的问题。
  6. cmake配置路径的时候用反斜杠/,正斜杠\识别不到文件
  7. java的话除了jdk环境,环境变量也要有ant。ant下载
  8. 遇到的问题 报错的话cmake搜下对应的模块勾上
  9. 编译有时候失败不知道为什么,重试了几次才好,很奇妙。

使用

  1. 微信二维码检测器使用神经网络来识别,模型主要包括CNN模型,以及SR高分辨率模型。
  2. 模型文件地址
  3. opencv显示中文的时候是乱码 需要转换为系统图片处理添加文字后再转回来。
  4. 解析图片的时候对于一些大的图片可以先做些缩放和压缩的处理。
  5. 二维码制作和解析也可以用com.google.zxing这个包,但是再识别上没wechat_qrcode效率高,是对zxing深度优化改造过的。
  6. 编译后就可以愉快的使用工具了。
  7. 测试例子
scss 复制代码
public static void main(String[] args) {
    //初始加载依赖win下dll,linux下so
    InitUtil.Init();
    Mat img = Imgcodecs.imread("D:\java_image_test\rc.png");
    Imgproc.resize(img,img, new Size(640, 640));
    WeChatQRCode we = new WeChatQRCode();

    //微信二维码对象,要返回二维码坐标前2个参数必传;后2个在二维码小或不清晰时必传。
   // WeChatQRCode we = new WeChatQRCode(Config.detector_prototxt_path,Config.detector_caffe_model_path,Config.super_resolution_prototxt_path,Config.super_resolution_caffe_model_path);
    List<Mat> points = new ArrayList<Mat>();
    //微信二维码引擎解码,返回的valList中存放的是解码后的数据,points中Mat存放的是二维码4个角的坐标
    List<String> valList = we.detectAndDecode(img, points);
    for(int i = 0; i < valList.size(); i++) {
        //根据坐标画矩形,就是二维码上的那个框
        Imgproc.rectangle(img,new Point(points.get(i).get(0, 0)[0],points.get(i).get(0, 1)[0]),new Point(points.get(i).get(2, 0)[0],points.get(i).get(2, 1)[0]),new Scalar(0, 0, 255),2);
        //opencv的Imgproc.putText方法中文会乱码,如果是英文可以直接使用。
        System.out.println(valList.get(i));
        //Imgproc.putText(img, valList.get(i), new Point(points.get(i).get(0, 0)[0],points.get(i).get(0, 1)[0] - 10), fontFace, 1, new Scalar(0, 0, 255), 2);
         Point textOrg = new Point(points.get(i).get(0, 0)[0],points.get(i).get(0, 1)[0] - 10);
         img= CommonCVUtils.chinaFontText(img,"内容"+textOrg,valList.get(i));
    }
    HighGui.imshow("一护", img);
    HighGui.waitKey(0);
    System.exit(0);
}
相关推荐
V+zmm1013420 分钟前
外卖商城平台的微信小程序ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·springboot
Jason-河山44 分钟前
利用Java爬虫获得店铺详情:技术解析
java·开发语言·爬虫
yava_free1 小时前
介绍一下mysql binlog查看指定数据库的方法
java·数据库·mysql
疯一样的码农1 小时前
Maven Surefire 插件简介
java·maven
疯一样的码农1 小时前
Maven 仓库
java·maven
ᝰꫝꪉꪯꫀ3611 小时前
JavaWeb——Maven高级
java·后端·maven·springboot
weixin_452600691 小时前
【青牛科技】D1117 1.0A低压差线性稳压电路芯片介绍,可保证了输出电压精度控制在±1.5%的范围内
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·dvd 解码板
封步宇AIGC1 小时前
量化交易系统开发-实时行情自动化交易-4.4.1.做市策略实现
人工智能·python·机器学习·数据挖掘
kiddkid1 小时前
RabbitMQ高级
java·rabbitmq·java-rabbitmq
港股研究社2 小时前
华为Mate 70系列发布,揭示AI+消费电子产业化新阶段
人工智能·华为