在移动端 OCR 场景下,核心挑战不是“识别”,而是 “采集”。 我们要解决的是:如何在不可控的光照环境下,获取一张清晰、无反光、正对的文档图像。
1. 放弃“单张拍照”,拥抱“视频流多帧融合”
传统的相机 App 逻辑是:按下快门 -> 捕捉一帧 -> 处理。 但在反光场景下,单帧图像往往是废片。 我们需要利用 视频流(Video Stream) 的优势:手机摄像头每秒能吐出 30 帧画面。
核心算法:多帧去反光 (Multi-frame Reflection Removal)
- 原理: 当用户稍微移动手机角度时,文字的位置(相对于执照边缘)是不变的,但 反光光斑的位置是移动的。
- 交互引导: APP 不再显示“拍照”按钮,而是显示“扫描中,请轻微晃动手机”。
- 算法流程:
- 特征点对齐 (Feature Alignment):SDK 在视频流中连续抓取 5 帧图像。利用 SIFT/ORB 特征点,将这 5 帧图像中的“执照文字”对齐。
- 光斑检测:比较这 5 帧图像。如果在某一个像素点上,第 1 帧是高亮的(白色 255),但第 3 帧是正常的(灰色 100),说明第 1 帧那个点是反光。
- 像素融合 (Pixel Fusion):利用 中值滤波 (Median Filter) 或 加权平均,取 5 帧中“非高亮”的像素值,合成一张全新的图片。
2. 解决“歪脖子”难题:透视变换 (Perspective Correction)
为了避开反光,销售往往不敢正对着拍,而是站在侧面 45 度角斜着拍。 这就导致拍出来的执照是 梯形 的,远处的字很小,近处的字很大。OCR 很难处理这种畸变。
工程解决方案:
- 边缘检测 (Edge Detection): 在视频流中,运行一个轻量级的 HED (Holistically-Nested Edge Detection) 或基于传统 CV 的 LSD (Line Segment Detector),实时寻找执照的 4 个角点。
- 透视变换 (Homography Warping): 一旦锁定 4 个角点,SDK 利用 OpenCV 的
getPerspectiveTransform函数,将梯形图像“拉伸”为标准的矩形(正视图)。 - 超分辨率 (Super Resolution): 因为斜着拍会导致远处的文字分辨率降低(模糊)。在矫正后,可以接一个轻量级的 SRCNN (Super-Resolution CNN) 模型,把模糊的文字“锐化”一下,提升 OCR 准确率。
3. 交互设计的“防呆”指引
除了算法,UI 交互 也是解决问题的关键。
- 光照检测与提示: 利用手机的光线传感器(Light Sensor)或图像直方图分析。
- 环境太暗:自动开启闪光灯(Torch Mode),但同时提示“请保持距离,避免过曝”。
- 环境太亮(逆光):提示“请避开强光直射”。
- ROI 区域锁定: 在屏幕中央画一个半透明的“绿色框”。
- 逻辑:只有当营业执照的 4 个边缘完全进入框内,且清晰度(Laplacian Variance)达标时,框才变绿,并自动触发识别。
- 价值:强迫销售人员把手机拿稳、拿正,从源头保证图片质量。
4. 离线优先:弱网环境下的生存法则
地推经常要去地下商场、菜市场深处,那里信号极差(甚至无服务)。 如果 OCR 依赖云端 API,销售拍完照转圈 30 秒上传失败,他会想摔手机。
技术选型: 必须采用 端侧 OCR (On-device OCR)。
- 模型轻量化:使用 MobileNetV3 或 ShuffleNet 作为骨干网络,将检测+识别模型压缩到 10MB 以内。
- NPU 加速:利用 Android NNAPI 或 iOS CoreML,调用手机的 NPU/GPU 进行推理。
- 性能指标:在千元机(低端 Android)上,单次识别耗时应控制在 300ms 以内。
5. 总结
在 B2B 地推业务中,营业执照 OCR 是销售录入信息的“第一公里”。
通过 “多帧去反光 + 透视变换 + 离线识别” 的组合拳,我们解决的不仅仅是一个图像处理问题,而是 地推人员的尊严问题。
让他们不需要像“修空调的”一样爬高上低找角度,也不需要像“审犯人”一样让老板把执照取下来。 随手一拍,即刻录入。 这才是顶级 CRM 该有的体验。