java识别图片二维码及提高识别率-ZXING

本文档内容主要基于java,包含图片中二维码的识别,以及如何提高识别精度

准备工作

引入jar包

        <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.beust/jcommander -->
        <dependency>
            <groupId>com.beust</groupId>
            <artifactId>jcommander</artifactId>
            <version>1.82</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.5.1</version>
        </dependency>

代码介绍

简单识别

本代码可用于普通且不包含中文内容的二维码图片的识别

    public static String readQrCodeImage(FileInputStream fileInputStream) throws Exception {
        BufferedImage readImage = ImageIO.read(fileInputStream);
        LuminanceSource source = new BufferedImageLuminanceSource(readImage);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        Result decode = qrCodeReader.decode(bitmap);
        return decode.getText();
    }

包含中文情况识别

本代码可用于包含中文内容的二维码图片的识别

    public static String readQrCodeImage(FileInputStream fileInputStream) throws Exception {
        BufferedImage readImage = ImageIO.read(fileInputStream);
        LuminanceSource source = new BufferedImageLuminanceSource(readImage);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        EnumMap<DecodeHintType,Object> hints = new EnumMap<>(DecodeHintType.class);
        //设置中文编码
        hints.put(DecodeHintType.CHARACTER_SET,"GBK");
        Result decode = qrCodeReader.decode(bitmap,hints);
        return decode.getText();
    }

图片清晰度差情况识别

本代码可用于图片清晰度差,图片中二维码不清晰情况下二维码图片的识别
针对图片不清晰情况,又不同措施:
1.对图片进行去除噪点的操作,生成高质量的图片(代价较大)
2.对图片进行截取,降低识别图片大小,提高图片中二维码所占比例
本次采用第2种方式对图片进行处理

    public static String readQrCodeImage(FileInputStream fileInputStream) throws Exception {
        BufferedImage readImage = ImageIO.read(fileInputStream);
        int width = readImage.getWidth();
        int height = readImage.getHeight();
        //截取图片左下1/4进行识别
        readImage = readImage.getSubimage(0, height/2, width/2 , height/2);
        LuminanceSource source = new BufferedImageLuminanceSource(readImage);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        EnumMap<DecodeHintType,Object> hints = new EnumMap<>(DecodeHintType.class);
        hints.put(DecodeHintType.CHARACTER_SET,"GBK");
        Result decode = qrCodeReader.decode(bitmap,hints);
        return decode.getText();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容