手机爱奇艺怎么扫码登录
爱奇艺移动端二维码扫描优化总结
二维码(QR Code,Quick Response)因其信息容量大、数据类型丰富等优势,已成为移动设备上应用广泛的编码方式。爱奇艺移动端也广泛应用二维码技术连接PC、网页、TV等平台,实现账号登录、支付等功能。二维码的点阵式编码方式容易受到视觉因素干扰,导致识别率和速度下降,影响用户体验。为提升用户体验,爱奇艺技术产品团队对二维码扫描性能进行了专项优化,将识别率从30%提升至75%左右,平均耗时从2.1s缩短至722ms。本文将详细分享爱奇艺在扫码优化实践方面的经验。
二维码虽具有成本低、兼容性好等优势,但易受光照、变形等因素干扰,影响识别效果。对于标准清晰的二维码,开源库ZXing/ZBar足以应对。但在以下特殊场景下,这些开源库的识别率难以满足业务需求:
- 深色背景,无明显分界线
- 低对比度
- 拉伸、扭曲变形
- 光照不均
针对上述问题,爱奇艺技术产品团队对原有的ZXing库进行了深度优化,主要从以下三个方面提升扫码性能:扫描速度优化、交互体验优化、识别率优化。
以下测试数据基于特定样本集,仅供参考:
一、 扫描速度优化
1. 避免不必要的格式转换和旋转操作
原有代码在相机预览回调函数`onPreviewFrame()`中,将YUV格式数据转换为RGB格式,并进行90°旋转。经分析,这些操作耗费了大量时间,且并非必要。优化方案是直接利用ZXing提供的`YUVLuminanceSource`解码YUV数据,并仅对裁剪区域坐标系进行旋转,从而大幅减少耗时。
2. 精简解码格式
ZXing默认支持20多种条码格式,循环遍历解码效率低下。结合爱奇艺业务特点,优化方案是仅保留对二维码的支持,缩短解码失败耗时,提升整体解码速度。
3. 合理设置预览大小和扫描框
ZXing 默认的预览帧大小通常为屏幕尺寸,分辨率越高,解码耗时越长。优化方案是调整预览帧大小设置,选择接近常规的尺寸,并裁剪二维码扫描框大小,在保证识别效果的同时提升解码速度。
4. 串行解码改为并行解码
ZXing默认采用单线程处理解码任务,效率较低。优化方案是利用`setPreviewCallback()`获取连续预览帧,并将解码任务提交至线程池并行处理,提升解码效率。
二、交互体验优化
1. 优化对焦模式,设置定点对焦
将默认的`AUTO_FOCUS`对焦模式改为`FOCUS_MODE_CONTINUOUS_PICTURE`,并在首次对焦清晰后保持清晰度,提升对焦速度。将对焦区域和测光区域设置为扫描框区域,提高远距离二维码的聚焦速度和识别成功率。
2. 支持自动缩放
当二维码较小或距离较远时,自动放大可提升用户体验和识别率。优化方案是根据定位点信息估算二维码尺寸,并与扫描框大小进行比较,自动调整相机焦距进行放大操作。
3. 支持单击聚焦,双击缩放
为用户提供更便捷的操作方式,支持单击屏幕进行定点聚焦,双击屏幕进行缩放操作。
4. 支持双指缩放调整焦距
当自动缩放无法满足需求时,允许用户使用双指缩放手势手动调整相机焦距。
三、识别率优化
针对ZXing在某些场景下识别率较低的问题,对ZXing算法进行改进,主要策略如下:
策略1:增加N:1:3:1:1的扫描模式
ZXing 默认的回字形图案定位方式针对白色背景设计,对于深色背景二维码识别率较低。优化方案是增加 N:1:3:1:1 的扫描模式,提升对深色背景二维码的识别能力。
图1 深色二维码示例
爱奇艺App二维码扫描优化
为提升用户体验,我们针对移动设备上二维码扫描功能进行了深度优化。本文将从以下几个方面介绍我们的优化策略:
1. 边缘重叠二维码识别优化
针对边缘重叠的二维码,我们对ZXing库中的 `FinderPatternFinder` 类进行了修改,使其能够识别N:1:3:1:1或1:1:3:1:N 类型的边界重叠场景。
具体来说,我们优化了状态机数组长度为5时的校验逻辑,增加了对中央部分 1:3:1 结构的校验,并根据校验结果判断是左边界还是右边界重叠,从而进行相应的修正。我们还同步修改了源码中对角线的校验逻辑,并增加了反向对角线的校验策略,进一步提升了识别准确率。
2. 右下角点估计算法优化
对于版本号为1且没有校正点的二维码,或校正点存在污染、破损的情况,ZXing在非理想角度下的识别效果较差。
为此,我们利用左下角和右上角的回字形图案,通过定位下边界线和右边界线的交点,来精确估计右下角点的位置(如图2所示)。
图2 矫正二维码示例
在找到校正点的情况下,我们使用校正点进行透视变换;否则,则使用重新估计的右下角点进行透视变换。该策略有效增强了对倾斜版本为1的二维码的识别能力。
3. 定位点筛选和排序规则优化
ZXing在找到潜在定位点后,会进行筛选和过滤,找到符合条件的三个点,并排序确定左下、左上、右上点的顺序。
- 我们将定位点最大模块尺寸与最小模块尺寸的容忍阈值从40%调整到60%以上,增加了对严重倾斜二维码的容错性(如图3-b所示)。
- 针对相邻边长大于对角线的情况,我们在 `ResultPointorderBestPatterns()` 方法中增加了图片最大宽高的限制。如果假设最长边为对角线时,估计的第四个点落在图片外,则取次长边为对角线重新排序。
图3 倾斜二维码示例
4. 二值化算法优化
针对部分灰色低对比度或光照不均的图片,我们对二值化算法进行了优化。
我们评估了多种局部二值化算法,最终采用局部均值跳帧执行的辅助策略:部分帧使用ZXing自带二值化算法,部分帧使用局部均值二值化算法(如图4所示)。该策略有效提升了对光照不均和低对比度二维码的识别率。
图4 二值化图像
5. 集成OpenCV预处理
针对部分回字形中央模糊或存在椒盐噪点的二维码,我们集成了OpenCV计算机视觉库进行预处理。
- 通过中值滤波/高斯滤波等方法,有效减少了椒盐噪声的干扰。
- 对于旋转倾斜的二维码,我们利用OpenCV对图像进行仿射校正(旋转、拉伸),将其转换为水平方向的固定像素大小的二值化图像,再交由ZXing解码,提升了识别率。
特殊场景优化
- 弯曲畸变二维码: 对于版本号大于7的二维码,我们利用其4个以上的辅助校正点,通过更复杂的映射关系(例如二次函数)来拟合采样坐标系,从而识别曲面场景下的二维码。
- 反色二维码: 我们在ZXing定位回字形图案的过程中,增加了收集潜在反色桩点的机制,实现了对反色二维码的识别。
未来展望
我们将持续对二维码扫描功能进行优化,包括:
- 推广二维码标准规范化
- 探索使用TensorFlow图像识别技术检测二维码区域
- 尝试利用RenderScript和GPU加速二值化计算等.
我们计划将优化后的ZXing库开源至GitHub社区,与广大开发者分享我们的优化成果。
参考资料
1. 史上最全的支付宝二维码扫码优化技术方案: https://www.infoq.cn/article/hZg1aBXkmoIsGHAYGoH8
2. Lark二维码扫描优化:https://zhuanlan.zhihu.com/p/44845942
3. 智能设备上的二维码解码优化:https://cardinfolink.github.io/2017/06/28/%E6%99%BA%E8%83%BD%E8%AE%BE%E5%A4%87%E4%B8%8A%E7%9A%84%E4%BA%8C%E7%BB%B4%E7%A0%81%E8%A7%A3%E7%A0%81%E4%BC%98%E5%8C%96/