AVFoundation + (OpenCV + Zxing)
前言
二维码扫描是许多公司都需要的一款工具,也是一个难题,市面上免费的开源组件只能覆盖到特定的场景,而实际生活和工作中场景非常复杂,有的二维码打印出来的质感不好,有的二维码破损,也有的在电脑上受距离、光照等因素影响。
这是一款二维码扫描的解决方案。
iOS端扫描二维码主要是利用苹果提供的AVFoundation系列、Zxing、Zbar。而Zbar已经不再维护,我们不打算再使用(Android目前还在使用Zbar)。
因此,本方案是基于AVFoundation + Zxing共同实现的。当然,这两种技术在网上的例子很多,但都是一些独立使用的Demo,并没有整合的方案,像本项目这样的可以直接使用的就没有了。
为何这样做
为什么使用Zxing,实际上Zxing的扫描能力确实不如AVFoundation,目前苹果的扫码器能满足大部分场景,但是不是所有的二维码都是完美的。
比如:
1、有些二维码打印出来颜色变成了灰色(因手里的异常二维码属于公司私有不能拿出来)。
2、扫描受到光照的影响。
3、斜扫二维码。
这些异常场景普通的二维码扫码器是处理不了的,而我们又不能只使用二维码扫码器,那么我们能做的就是,在识别图片之前先对图片进行处理,然后再交给扫码器。
由于苹果的API太封闭,我们不知道如何单独调用苹果扫描API,因此这里就使用了Zxing作为备选方案。
当然,我们没有浪费苹果的二维码识别器,AVCaptureSession可以支持多个AVCaptureOutput,AVCaptureMetadataOutput就是苹果提供的二维码扫码器,我们在使用AVCaptureMetadataOutput的同时,也将使用AVCaptureVideoDataOutput,AVCaptureVideoDataOutput可以将每一帧回调出来,在这里就可以进行Zxing的识别。
这样,两种扫码器就可以同时工作了。
OpenCV
在二维码识别之前,如果有一种技术能将异常的二维码处理成高清晰度那就好了。此时OpenCV就可以派上用场了。由于二维码识别不关心颜色,所以图片二值化是我们最先想到的。将淡色的像素点处理成黑色后,相信二维码识别器就能较高成功率地识别了。
仅仅将图片进行二值化并不能完全解决问题,因为现实环境非常复杂,我们在扫码时可能会受到各种因素的影响,例如光照条件。因此,我们首先需要降低光照的影响。目前OpenCV的降噪效果并不理想,我们只是调用了medianBlur方法,这方面还有待深入研究。
目前OpenCV仅仅进行了噪声消除和图片二值化,但实际工作中只要不是要求过高,基本能够满足需求。
由于缺乏OpenCV相关知识,目前只能做到这一步。
支持功能
1、手势/自动缩放
2、自动对焦
3、识别图片
4、生成二维码
5、扫描view自定义
6、样式小调整
7、灯光打开/关闭
8、识别各种类型码
Cocoapods 使用
pod 'JDScan'
注:部分代码/资源来源于https://github.com/MxABC/LBXScan
如果是一名Android开发人员,可以参考https://github.com/LiuhangZhang/qrcode_android,这里提供了Android平台的解决方案。我们的方案最初也尝试了整体的二值化,但效果并不理想,后来借鉴了该项目中采用的分块二值化技术,效果还不错,因为本人在OpenCV方面的知识也比较有限。
本方案并非万能,但基本能满足大多数企业的需求。如果需要实现类似微信那样的功能,可能需要使用OCR技术。