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);
}
相关推荐
加油吧zkf9 分钟前
水下目标检测:突破与创新
人工智能·计算机视觉·目标跟踪
加油吧zkf9 分钟前
AI大模型如何重塑软件开发流程?——结合目标检测的深度实践与代码示例
开发语言·图像处理·人工智能·python·yolo
Java技术小馆11 分钟前
GitDiagram如何让你的GitHub项目可视化
java·后端·面试
峙峙峙22 分钟前
线性代数--AI数学基础复习
人工智能·线性代数
weiwuxian27 分钟前
揭开智能体的神秘面纱:原来你不是"超级AI"!
人工智能
Codebee28 分钟前
“自举开发“范式:OneCode如何用低代码重构自身工具链
java·人工智能·架构
说私域39 分钟前
基于开源AI智能名片链动2+1模式的S2B2C商城小程序:门店私域流量与视频号直播融合的生态创新研究
人工智能·小程序·开源
Ronin-Lotus42 分钟前
深度学习篇---Yolov系列
人工智能·深度学习
程序无bug44 分钟前
手写Spring框架
java·后端
程序无bug1 小时前
Spring 面向切面编程AOP 详细讲解
java·前端