Java使用opencv调用微信扫描二维码引擎,附带windows和linux需要的动态库文件


前言

        最近公司项目有一个需求,要用二维码传递数据。于是使用了zxing生成和解析二维码,但是zxing扫描二维码原图还可以,一旦扫描用户使用手机拍摄的二维码,识别率急剧下降。尝试了对拍摄的照片进行降噪,二值化,但对识别率始终不太满意。

        于是百度了一番,发现今年微信将自家扫描二维码引擎在opencv上开源了,所以当然是使用微信扫码啦,至于微信扫码引擎识别率高的原因就不介绍了,有喜欢研究的小伙伴可以自行百度。

        下面是本人调用opencv扫码功能的一些步骤,希望可以帮到大家,也给自己做一个记录。

一、使用步骤

        微信扫码功能是在opencv的拓展模块下,所以大家需要重新编译opencv和opencv-contrib,这里直接提供给大家

        使用功能时先扫描本地动态库文件和微信扫码需要的模板,之后就可以愉快的扫码了

二、代码

1.主要功能类

public class WeChatDeCode {

    private static String path;

    static {
        OpencvConfig opencvConfig = new OpencvConfig();
        path = opencvConfig.getOpencvPath();
        System.load(path+File.separator+ Configs.lib_path);
    }


    public static void main(String... args) throws IOException {
        File file = new File("D:\\SpringCloudTest\\test\\picture\\20211101-test-005.1.jpg");
        BufferedImage image = ImageIO.read(file);
        open(image);
    }


    public static String open(BufferedImage image) {
        return openPic(image);
    }


    private static String openPic(BufferedImage image) {

        Mat img = Converters.img2mat(image);
        return deCode(img);
    }

    private  static String deCode(Mat img) {
        //微信二维码对象,要返回二维码坐标前2个参数必传;后2个在二维码小或不清晰时必传。
        WeChatQRCode we = new WeChatQRCode(path+File.separator+ Configs.detector_prototxt_path, path+File.separator+ Configs.detector_caffe_model_path, path+File.separator+ Configs.super_resolution_prototxt_path, path+File.separator+ Configs.super_resolution_caffe_model_path);
        List<Mat> points = new ArrayList<Mat>();
        //微信二维码引擎解码,返回的valList中存放的是解码后的数据,points中Mat存放的是二维码4个角的坐标
        List<String> valList = we.detectAndDecode(img,points);

        System.out.println(valList.get(0));
        return valList.get(0);
    }
}

2.引用类

public class Configs extends ClassLoader {
    public static final String detector_prototxt_path = "detect.prototxt";
    public static final String detector_caffe_model_path = "detect.caffemodel";
    public static final String super_resolution_prototxt_path = "sr.prototxt";
    public static final String super_resolution_caffe_model_path = "sr.caffemodel";
    public static String lib_path;

    static {
        String lib = "";
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("windows")) {
            lib = "opencv_java452.dll";
        } else if (os.contains("linux")) {
            lib = "libopencv_java452.so";
        } else if (os.contains("mac")) {
            lib = "opencv_java452.jnilib";
        }
        lib_path = lib;

    }

    public Configs() {
    }
}

3.读取配置类

@Configuration
public class OpencvConfig {

    private static String opencvPath;

    @Value("${opencvPath}")
    public  void setUsername(String opencvPath) {
        OpencvConfig.opencvPath = opencvPath;
    }

    public  String getOpencvPath() {
        return opencvPath;
    }
}

4.配置文件

        之后在yml文件添加一个 opencvPath 的目录位置

总结

        到这里就结束了,整个过程踩了很多坑,比如opencv和opencv-contrib的的编译,功能类中引入动态库文件不正确等等。

        比如需要加载本地文件时,在IDEA中是可以正常运行的,但是打成jar包以后在windows或者linux系统中就无法运行,提醒一下自己,以后多注意这方面的东西

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用Java语言调用OpenCV库实现微信扫描二维码引擎功能的步骤如下: 首先,确保已经安装了Java开发环境和OpenCV库。 1. 导入所需的Java库和OpenCV库: 在Java项目中,我们需要导入相应的Java库和OpenCV库。可以使用构建工具如Maven或Gradle来导入这些库。 2. 加载OpenCV库: 在Java代码中,需要调用OpenCV库的功能之前,需要先加载OpenCV库。可以使用`System.loadLibrary()`方法来加载OpenCV核心库。 3. 打开摄像头并捕获图像: 在Java中,可以使用OpenCV的`VideoCapture`类来打开摄像头,并通过`read()`方法捕获图像。 4. 对捕获到的图像进行处理: 使用OpenCV提供的图像处理功能,可以对捕获到的图像进行二维码识别的预处理,如去噪、图像增强等。 5. 进行二维码识别使用OpenCV提供的二维码识别功能,可以对预处理后的图像进行二维码识别。可以调用相应的方法来进行识别,并获取二维码的信息。 6. 使用微信API进行扫码确认: 如果需要二维码的信息传递到微信进行扫码确认,可以调用微信提供的API,将识别到的二维码信息传递给微信进行验证。 7. 处理识别结果: 根据微信返回的结果,可以进行相应的处理。例如,可以根据识别结果进行跳转、处理业务逻辑等。 以上是使用JavaOpenCV调用微信扫描二维码引擎的基本步骤。通过使用OpenCV库的图像处理功能和二维码识别功能,结合微信提供的API,可以实现二维码扫描和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值