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);
}
相关推荐
jndingxin6 分钟前
OpenCV CUDA模块图像变形------对图像进行任意形式的重映射(Remapping)操作函数remap()
人工智能·opencv·计算机视觉
知舟不叙12 分钟前
基于OpenCV实现视频运动目标检测与跟踪
opencv·目标检测·目标跟踪·音视频
JNU freshman19 分钟前
维度匹配 之 降维的艺术性!
人工智能·神经网络
希艾席帝恩24 分钟前
从传统楼盘到智慧空间:数字孪生的地产赋能之路
大数据·运维·服务器·人工智能·数字孪生·云渲染
黎䪽圓24 分钟前
【Java多线程从青铜到王者】阻塞队列(十)
java·开发语言
慧星云25 分钟前
ComfyUI工作流一键美颜:照片美颜只需要点击即可完成
人工智能·云计算·aigc
包达叔31 分钟前
超简单部署离线语音合成TTS和语音识别
人工智能·语音识别·语音合成·离线
IT古董31 分钟前
【第一章:人工智能基础】02.数据处理及可视化-(3)可视化工具与技术
人工智能
lgbisha33 分钟前
华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的AI-Agent
人工智能·ai·华为云