相机 OCR 使用本地分叉的 vision_text_recognition 包运行 OCR,支持拉丁文、中文(简体和繁体)、日文和韩文脚本。识别过程无需上传任何内容。OCR 引擎返回的每个文本块都带有自己的边界框和识别文本;结果页将翻译绘制回同一坐标,从而保留原始布局。
拍摄流程
- 相机初始化。 相机控制器以显式的
initializing / ready / failed状态进行异步初始化。失败时会显示重试按钮,可在不重新进入initializing守卫的情况下重新运行初始化。 - 真实方向。 当应用锁定为竖屏时,iOS 的
DeviceOrientation和 EXIF 不可靠。应用通过sensors_plus读取原始加速度计,并缓存最近一帧,因此即使 UI 被锁定,快门也能以真实的握持方向拍摄。然后将 EXIF 方向与此真实情况协调一致。 - 快门。 点击以当前预览宽高比拍摄。拍摄后帧在 OCR 前会下采样到可配置的最大边长——大多数页面需要在长边 1500–2000 像素才能让引擎读取细小文字而不占用过多内存。
- 闪光灯。 取景器中提供四种模式——自动、关、开和手电筒——切换绑定到系统闪光 API。
OCR 返回的内容
- 每个块的边界框。 每个 TextBlock 都有自己的矩形。结果页使用这些边界框将翻译后的文本精确定位到源文本上。
- 块文本和顺序。 每个块的源语言文本,按照引擎发出的顺序(默认从上到下、从左到右)。
- 置信度。 每个块都有自己的置信度。低于阈值的块会在结果页中渲染但标记为"低置信度",以便用户验证。
为什么在设备本地处理
- 隐私。 街牌、合同或医疗表格的照片永远不会离开设备进行 OCR。
- 延迟。 无网络往返。在最近的设备上,典型的手机拍摄页面的 OCR 在一秒内完成。
- 离线。 OCR 可在飞机上、地下室和没有网络的地区工作。运行识别的同一引擎完全依赖设备本地模型。
提高 OCR 准确性的最佳实践
- 均匀的间接光。 窗光优于头顶聚光灯。穿过页面的阴影是字符误读的最常见原因。
- 点击对焦。 如果自动对焦选择了错误对象(桌面、手指、页边),请在拍摄前点击文本中心。
- 平整的页面。 向书脊弯曲的页面会在装订线附近丢失字符。尽可能用另一只手将页面压平。
- 每次拍摄一种语言。 混合脚本的页面可在一次扫描中处理,但混排拉丁文与竖排日文的页面最好分成两次拍摄。