Android 二维码开发功能实现(五)-----对zxing进行优化,提高扫码速度与精确度

版权声明:本文为博主原创文章,转载必须注明出处!! https://blog.csdn.net/qq_34902522/article/details/83859925

对zxing进行优化的思考

前言

对于Google 的开源框架Zxing库的使用介绍,前面也通过几篇文章进行解读.

  1. Android 二维码的扫码功能实现(一)
  2. Android 基于Zxing的扫码功能实现(二)
  3. Android 基于Zxing扫码实现(三)、从相册选取二维码
  4. Android 二维码开发功能实现(四)------基于Zxing实现编码功能(生成二维码,一维码等)

日常关于条码的开发需求通过前几篇的博文学习,基本上来说都是可以满足的.本文是在满足需求实现功能后的基础上,提出一些更优化的思路.让扫码功能变得更加优化,精准度和速度再次提升.
该系列的第二篇文章 Android 基于Zxing的扫码功能实现(二) 中,当时已经提出了一些扫码的优化逻辑,包括有: 移除不需要的BarcodeFormat,保留我们支持的条码格式即可;控制扫码的矩形框大小;控制聚焦时间等优化策略.具体的可以移步至本系列第二篇博文查看.
这些优化策略确实达到了效果,提高了扫码速率与准度.现在随着使用的深入了解与学习,发现了一些还可以进一步优化的思路.在此总结一下.后续有时间会慢慢有代码实现,开源到Github YZxing项目上面.
YZxing地址 .


优化思路

支持Camera 缩放 (Support Camera ZOOM)
  1. 在使用YZxing的时候,如果二维码距离相机镜头太远,此时扫码的成功率就会下降,所以,为了增加用户的体验,可以考虑加入,手指缩放功能,调节二维码图案的大小.
  2. 除了通过用手指进行Camera zoom in/out 功能,更人性话点,我们考虑可以加入Auto Zoom的功能.通过Zxing库里面的相关类.可以做到,先检测到条码的形状大小,然后根据检测到的条码宽度与扫码框宽度或者preview 宽度做比较,以此来进行合适的缩放,最后在对缩放后的二维码进行结果检测.核心代码如下:
...
...

DetectorResult detectorResult = new Detector(bitmap.getBlackMatrix()).detect(hints);
                ResultPoint[] points = detectorResult.getPoints();
                if (points!=null&&points.length>0){
                    for (int i=0;i<points.length;i++){
                        Log.e(TAG, "decode:  points["+i+"]="+points[i].toString() );
                    }
                }
                // 根据points里面的封装的条码位置大小信息,来对Camera进行AutoZoom
                ...
                Decoder decoder = new Decoder();
                DecoderResult decoderResult = decoder.decode(detectorResult.getBits(), hints);
                // DecoderResult 类对扫码结果进行了封装
...
...

上面代码中,Detector,DetectorResult,Decoder ,DecoderResult 等类都是Zxing库里面自带的,进源码看一下就知道了.
目前Zxing 的官方sample和YZxing的扫码实现用的是MultiFormatReader类和Result类的组合使用.
通过Camera zoom 来控制二维码的大小可以提高扫码精度.

DecodeThread 变为多线程并行实现

目前YZxing中是使用的一个子线程来做Decode解码逻辑,是来一帧,解码一帧,这帧解码完成后,才能开始下一帧.后续可以考虑尝试多线程的并行解码.无需等待,来一帧直接安排Decode.哪个线程解码OK了,通知其他线程 “解码完成,全都停止” .这样就提高了扫码的速度.

对二维码图片进行裁剪

在使用YZxing的过程中,发现了一个问题,从相册获取二维码这个功能,如果获取到的图片上面的二维码特别小,那么很大几率扫码失败.这个问题可以考虑通过,对图片进行适当裁剪来解决,比如通过调用系统的裁剪框,或者自己定义一个裁剪框.对照片裁剪后,照片里的二维码就变大了,就可以扫码成功了.



目前优化思路,有这几个,后续有新的想法还会提出来.

补充

笔者在工作中发现了一个也还挺不错的扫码库.有大致的实现试过,扫码效率,准度挺高的.而且使用上来说比ZXing简单点,这个库叫Google mobile Vision库(官宣不再维护了,要移到firebase ML Kit 库里),里面有一个barcode vision的,现在这个mobile vision库要移到firebase里ML Kit库里,有兴趣可以去体验下. 这边之前也大致介绍过ML Kit库,并通过该library 实现了人脸检测功能,感兴趣的可以去看看. Google Vision 人脸检测

猜你喜欢

转载自blog.csdn.net/qq_34902522/article/details/83859925