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);
}
相关推荐
拓端研究室36 分钟前
2026年人工智能AI未来报告:智能体、元宇宙、教育、商业化落地|附400+份报告PDF、数据、可视化模板汇总下载
人工智能·百度
橙露6 小时前
数据特征工程:缺失值、异常值、标准化一站式解决方案
人工智能·机器学习
新加坡内哥谈技术6 小时前
OpenAI 的 Codex 团队如何工作并利用 AI
人工智能
码农阿豪6 小时前
Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间
java·安全·nacos
星河耀银海6 小时前
人工智能大模型的安全与隐私保护:技术防御与合规实践
人工智能·安全·ai·隐私
直有两条腿7 小时前
【大模型】Langchain4j
java·langchain
love530love7 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
njsgcs7 小时前
agentscope提取msg+llama_index 查询
人工智能
消失的旧时光-19437 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
莫寒清7 小时前
ThreadLocal
java·面试