本文字数:5939字
预计阅读时间:15 分钟
概述
长按图片识别二维码在移动端是很常见的操作,长按后需要对图片进行识别,并且将二维码中所包含的数据解码出来。在我们的业务场景中,是通过点击图片进入大图预览页面。长按大图预览的图片,会识别图片中的二维码,并且显示有跳转按钮,提示用户可以跳转二维码对应的页面。
但是,在现有业务场景中,要求图片中二维码不能在视觉上占据太大的位置,所以只能以很小的尺寸显示在下面。为了更好的配合公司现有业务,保证对图片中二维码的识别率,所以需要对二维码识别进行优化。
优化方案

方案总体分为探测和识别两个核心流程,探测流程主要由图像处理算法,以及OpenCV
来实现,识别流程主要由系统AVFoundation
库的CIDetector
来实现。先将二维码所在区域探测出来,随后对这个区域进行识别增强的处理,以实现模糊、较小的二维码的识别。
探测流程
因为不是每一张图片上都有二维码,探测的意义在于,查找图片中是否有二维码,以及二维码在图片中的位置。从而进行后续的针对性处理。以下,任何一步探测有结果,都将进入识别流程中,并且将探测到的位置传给识别方法。
第一次探测。转灰度图,通过
OpenCV
的cvtColor
函数,将四通道的RGBA
图片,转换为单通道的灰度图。第二次探测。通过算法进行直方图均衡化(非自适应,并且限制对比度),目的是让图片内轮廓清晰。
第三次探测。通过算法进行伽马变换,目的是增强图像对比度。
第四次探测。将原始灰度图的下面
20%
的右半部分,clone
到一个新的Mat
对象中,并且进行3.5
倍的resize
。将得到后的灰度大图调用detect
进行探测。第五次探测。将原始灰度图的下面
20%
的左半部分,clone
到一个新的Mat
对象中,并且进行3.5
倍的resize
。将得到后的灰度大图调用detect
进行探测。探测结束。在二维码的定位图形、码元等核心信息没有受损的前提下,这时候基本断定这张图片上没有二维码。
需要注意的是,在探测方案中,为什么选取下面左右两边的20%
着重进行探测。是因为根据对公司实际业务的调研,绝大多数的二维码都是在图片的右下角位置,其次是左下角。以公司业务为例,目前没见过将二维码放在图片中间的场景。