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);
}
相关推荐
B站计算机毕业设计之家21 小时前
智慧交通项目:Python+YOLOv8 实时交通标志系统 深度学习实战(TT100K+PySide6 源码+文档)✅
人工智能·python·深度学习·yolo·计算机视觉·智慧交通·交通标志
高工智能汽车21 小时前
棱镜观察|极氪销量遇阻?千里智驾左手服务吉利、右手对标华为
人工智能·华为
txwtech21 小时前
第6篇 OpenCV RotatedRect如何判断矩形的角度
人工智能·opencv·计算机视觉
正牌强哥21 小时前
Futures_ML——机器学习在期货量化交易中的应用与实践
人工智能·python·机器学习·ai·交易·akshare
倔强青铜三21 小时前
苦练Python第62天:零基础玩转CSV文件读写,csv模块实战
人工智能·python·面试
大模型真好玩1 天前
低代码Agent开发框架使用指南(二)—Coze平台核心功能概览
人工智能·coze·deepseek
皮皮林5511 天前
订单分库分表后,商家如何高效的查询?
java
Roye_ack1 天前
【项目实战 Day12】springboot + vue 苍穹外卖系统(Apache POI + 工作台模块 + Excel表格导出 完结)
java·spring boot·后端·excel·苍穹外卖
jerryinwuhan1 天前
最短路径问题总结
开发语言·人工智能·python
wanhengidc1 天前
云手机能够做些什么?
运维·服务器·人工智能·智能手机·云计算