ZXing二维码解析&精度提高一瞥

报表中含有单号二维码,纸质单据经扫描仪扫描为图片后,使用com.google.zxing解析二维码生成单号供程序使用。在实际使用过程中发现二维码解析时而有失败的情况,对扫描的单据图片进行分析后发现,解析失败得到都是扫描质量稍差者。

为了提高解析的成功率,首先想到的是报表单据打印的质量以及扫描为图片的质量都要好才能保证图片的质量,但实操的过程中受限于使用者的打印机和扫描仪,以及操作人员的水平,只好建议他们尽量使用较好的设备。其次,就是优化代码,看看是否能在代码的层面提高二维码识别率。

从代码的层面提高识别率,想到2个方案,其一对图片进行去除噪点的操作,生成高质量的图片;另外就是考虑到把整个图给Zxing进行识别,此时图片质量稍差就无法识,那么只是截取图片的中的二维码部分给ZXing识别是不是能提高识别率呢?

经实战发现对图片进行降噪,代价太大,在笔者的计算机上一张图降噪处理需要5秒钟左右,对于批量识别的情况不大适合。

所以,只要采取截取图片的中的二维码部分给ZXing识别这个方案试下了。

代码如下,其中 image = image.getSubimage(x,y,width,height);为核心代码。

 public static String decode(BufferedImage image,int x,int y,double width,double height) {
        try {
            image = image.getSubimage(x,y,width,height);
            LuminanceSource luminanceSource = new BufferedImageLuminanceSource(image);
            Binarizer binarizer = new HybridBinarizer(luminanceSource);
            BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
            Map<DecodeHintType, Object> hints = new HashMap<>();
            // 解码设置编码方式为:utf-8,
            hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
             //优化精度
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            Result result = new QRCodeReader().decode(binaryBitmap, hints);
            return result.getText();
        } catch (NotFoundException | ChecksumException | FormatException e) {
            log.error("图片中不存在二维码或者解析而二维码失败", e);
            throw new ServiceException("图片中不存在二维码或者解析而二维码失败", e);
        }
    }

经过测试,上面的代码大大提高了二维码的解析成功率。

备注,另外根据测试发现识别的精度还和二维码的大小有关系,如果二维码过大可以通过等比率缩放的方式将二维码缩小,代码如下:

  public static BufferedImage getScale(BufferedImage image,double scale) {
        AffineTransformOp transformOp = new AffineTransformOp(AffineTransform.getScaleInstance(scale, scale), null);
        image = transformOp.filter(image, null);
        return image;
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在C++中解析二维码,您可以使用ZXing库。ZXing是一个开源的条码和二维码处理库,提供了多种编程语言的接口,包括C++。 以下是使用ZXing C++库解析二维码的基本步骤: 1. 首先,您需要下载并编译ZXing C++库。您可以从 https://github.com/nu-book/zxing-cpp 获取源代码,并按照项目的说明进行编译。 2. 在您的C++项目中,包含所需的头文件。例如: ```cpp #include <zxing/ZXing.h> #include <zxing/DecodeHints.h> #include <zxing/BinaryBitmap.h> #include <zxing/ReaderException.h> #include <zxing/common/GlobalHistogramBinarizer.h> #include <zxing/qrcode/QRCodeReader.h> ``` 3. 创建一个二维码图像的二进制位图对象。您可以从图像文件中加载二维码图像,或者根据其他方式创建二维码图像的位图对象。 ```cpp zxing::Ref<zxing::LuminanceSource> source = zxing::ImageSource::create("<image_filename>"); zxing::Ref<zxing::BinaryBitmap> bitmap = zxing::Ref<zxing::BinaryBitmap>(new zxing::BinaryBitmap(zxing::Ref<zxing::Binarizer>(new zxing::GlobalHistogramBinarizer(source)))); ``` 4. 创建一个解码提示对象,并设置所需的解码参数。例如,您可以指定要处理的条码类型: ```cpp zxing::DecodeHints hints; hints.setTryHarder(false); // 是否尝试更多次数的解码 hints.setFormats(zxing::BarcodeFormat::QR_CODE); // 设置要解码的条码类型,这里设置为QR码 ``` 5. 创建一个QR码阅读器对象,并使用上述设置进行解码: ```cpp zxing::Ref<zxing::qrcode::QRCodeReader> reader = zxing::Ref<zxing::qrcode::QRCodeReader>(); std::string result; try { result = reader->decode(bitmap, hints).getText()->getText(); } catch(const zxing::Exception& e) { // 处理解码异常 } ``` 6. 解码完成后,您可以从`result`变量中获取解码结果。 这是一个基本的示例,用于在C++中使用ZXing解析二维码。您可以根据自己的需求进行调整和扩展。 希望对您有所帮助!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值