应用中的Text Recognition — 什么是OCR和Vision

作者: IT Sectr 发布日期: 2026-07-18 阅读时间: 10 分钟

Text Recognition(OCR — Optical Character Recognition)— 是一种从图像和视频流中提取打印或手写文本的技术。在移动开发中,Text Recognition用于文档数字化、车牌识别、读取名片和实时翻译文本。主要的移动OCR解决方案:ML Kit Text Recognition(Google)、Vision Framework(Apple)、Tesseract OCR(开源)。根据Google ML Kit,2025的数据,Text Recognition V2在10–30毫秒内处理一帧,拉丁字母准确率96%,西里尔字母准确率91%。

要点

  • Text Recognition — 从图像和视频中提取文本(OCR)
  • ML Kit Text Recognition — 45+种语言,96%准确率(拉丁字母),10–30毫秒
  • Apple Vision — VNRecognizeTextRequest,13+种语言,原生iOS
  • Tesseract — 开源OCR,100+种语言,50–200毫秒,CPU
  • Real-time — 在现代设备上使用CameraX/AVFoundation可达30 FPS

什么是Text Recognition:OCR原理

Text Recognition(OCR)— 计算机视觉过程,将文本图像转换为机器可读字符。OCR包括以下阶段:图像预处理(二值化、去 skew、倾斜校正)、分割(分成行、词、字符)、识别(每个字符的分类)和后处理(字典检查、错误校正)。现代OCR系统(ML Kit、Vision)使用端到端神经网络,结合所有阶段。

OCR类型:印刷文本(printed text)— 从文档、标牌、屏幕中识别机器文本 — 准确率95–99%;手写文本(handwriting)— 识别手写输入 — 拉丁字母准确率80–90%,西里尔字母70–80%;场景文本(scene text)— 自然场景中的文本:门牌号、路标、商店名称 — 由于透视畸变和眩光而最为困难。

CRNN + CTC Loss — 现代OCR模型中使用的架构。卷积循环神经网络(CNN + LSTM)提取图像特征,连接主义时间分类解码字符序列而无需预先分割。CRNN适用于任意长度的文本,对倾斜和畸变具有鲁棒性。根据arXiv(2025),CRNN模型在ICDAR 2019基准测试上达到97.5%的准确率。

OCR解决方案准确率速度语言平台
ML Kit V296%10–30毫秒45+Android,iOS
Apple Vision95%10–40毫秒13+iOS,macOS
Tesseract 590%50–200毫秒100+跨平台
Google Cloud Vision98%500–1000毫秒200+服务器(API)

移动设备的CRNN — ML Kit使用MobileNetV2 + CRNN模型,采用INT8量化。模型占用2–5 MB(latent),通过TFLite Delegate在GPU/NPU上运行。与Tesseract(经典pipeline)不同,神经网络OCR不需要单独的分割字符,对噪声更具鲁棒性。缺点:需要GPU或NPU才能实现实时 — 在纯CPU上速度降至5–10 FPS。

Android和iOS上的ML Kit Text Recognition

ML Kit Text Recognition — 移动应用的主要OCR工具。有两个版本:V2(Latin-based — 针对拉丁字母、西里尔字母、数字进行了优化)和V1(Latin + CJK — 日语、中文、韩语,但速度较慢)。V2使用端到端CRNN模型,V1使用较旧的CNN + LSTM。Google建议在所有情况下使用V2,除非需要CJK识别。

ML Kit结果结构:Text → TextBlock → Line → Element(Word/Symbol)。每个级别都有bounding box、confidence(0..1)和recognised text。Text — 根对象,包含fullText(所有识别出的文本在一行中)。TextBlock — 文本的逻辑块(段落、列)。Line — 文本行。Element — 词或符号。使用confidence过滤不准确的识别。

kotlin
// ML Kit Text Recognition V2
val recognizer = TextRecognition.getClient(
    TextRecognizerOptions.DEFAULT_OPTIONS
)

recognizer.process(inputImage)
    .addOnSuccessListener { text ->
        val fullText = text.text
        text.textBlocks.forEach { block ->
            val blockText = block.text
            val blockRect = block.boundingBox
            block.lines.forEach { line ->
                line.elements.forEach { element ->
                    val word = element.text
                    val confidence = element.confidence
                }
            }
        }
    }
    .addOnFailureListener { error -> /* error */ }

iOS上的Text Recognition通过ML Kit:API类似于Android,但使用UIImage/CVPixelBuffer而不是InputImage。ML Kit通过Core ML Delegate自动使用A12+上的Apple Neural Engine。对于iOS,ML Kit Text Recognition V2在iPhone 15 Pro上显示15–30毫秒的速度。为获得最大性能,在传输前将UIImage转换为CVPixelBuffer — 这减少了转换开销。

Apple Vision Framework:VNRecognizeTextRequest

Apple Vision Framework通过VNRecognizeTextRequest(iOS 13+)提供原生OCR。Vision OCR使用Apple Neural Engine(ANE),不需要额外的SDK。支持13种语言(EN、FR、IT、DE、ES、PT、ZH、JP、KO、RU、AR、TH、VI)。Vision自动检测文本语言(language correction)并支持一个帧中的多种语言。速度 — A16+上10–40毫秒。

Vision OCR特性:recognitionLevel(fast vs accurate)、automaticLanguageDetection、customWords(添加特定术语)、支持top candidates(模糊文本的多个识别变体)。fast模式在10–20毫秒内提供90%的准确率,accurate在30–50毫秒内提供95%的准确率。对于生产环境,使用accurate并过滤confidence >= 0.5。

swift
import Vision

let request = VNRecognizeTextRequest { request, error in
    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
    for observation in observations {
        let topCandidate = observation.topCandidates(1).first
        let text = topCandidate?.string ?? ""
        let confidence = topCandidate?.confidence ?? 0
        let boundingBox = observation.boundingBox
    }
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true

let handler = VNImageRequestHandler(cgImage: cgImage, orientation: .up)
try handler.perform([request])

iOS上的Vision vs ML Kit:Vision在较旧设备(iPhone X–13)上由于内置ANE而更快。ML Kit在复杂场景(畸变、倾斜、眩光)上更准确,这得益于在数百万张场景文本图像上训练的Google模型。Vision不支持单个字符的confidence(仅支持词),这限制了过滤。对于文档 — Vision(更快),对于场景文本 — ML Kit(更准确)。

Tesseract OCR:开源替代方案

Tesseract OCR — 开源文本识别引擎,由HP开发(1985–1998)并由Google继续开发(2006+)。Tesseract 5(基于LSTM)使用CRNN神经网络架构,与Tesseract 4(经典+ LSTM)相比,准确率显著提高。Tesseract支持100+种语言,包括西里尔字母、阿拉伯语、希伯来语和CJK。对于Android — tess-two(分支),对于iOS — swift-tesseract。

Tesseract的缺点:每帧50–200毫秒的速度(仅CPU,无GPU加速),需要图像预处理(二值化、去 skew、确定方向)才能传递给引擎,没有内置文本检测 — 需要传递图像区域(通常与OpenCV Text Detection或EAST配合使用)。Tesseract在清晰文档上提供90%的准确率,在场景文本上提供约70%的准确率。

何时选择Tesseract:如果应用在没有Google Play的设备(华为)上运行,需要支持稀有语言(梵语、希伯来语),或者需要完全定制OCR pipeline(在自己的字体上训练)。在所有其他情况下,ML Kit或Vision更快、更准确且需要更少的代码。Tesseract仅在第三方SDK受限时是合理的选择。

kotlin
// 通过tess-two使用Tesseract OCR
val tess = TessBaseAPI()
tess.init(dataPath, "rus+eng")
tess.pageSegMode = TessBaseAPI.PageSegMode.PSM_AUTO

val bitmap = BitmapFactory.decodeResource(resources, R.drawable.text)
val gray = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
OpenCV.process(bitmap, gray) // 二值化 + deskew

tess.setImage(gray)
val result = tess.utF8Text
tess.recycle()

Tesseract的预处理是强制性的:转换为灰度、二值化(Otsu或Adaptive)、倾斜校正(deskew)、去噪(median blur)。没有预处理,Tesseract的准确率降至50–60%。使用OpenCV进行预处理:Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate(deskew)。对于背景均匀的文档,二值化就足够了,对于场景文本 — 完整pipeline。

为OCR预处理图像

图像质量 — OCR准确率的主要因素。ML Kit和Vision具有内置预处理,但对于复杂情况(暗照片、模糊、过曝),额外处理可将准确率提高10–15%。主要技术:增加对比度(CLAHE)、去模糊(unsharp mask)、透视校正(perspective transform)、去除阴影和眩光。

CLAHE(Contrast Limited Adaptive Histogram Equalization) — 限制对比度的自适应直方图均衡化,改善局部区域的对比度。CLAHE对于光照不均匀的文档照片(一部分在阴影中,一部分在光亮处)有效。OpenCV Core.createCLAHE,clipLimit=2.0,tileGridSize=(8,8),为OCR提供最佳结果。CLAHE后,ML Kit在暗文档上的准确率从70%提高到88%。

透视校正 — 对于有角度的文档照片是强制性的。使用OpenCV findHomography + warpPerspective对齐文档。使用Canny边缘检测+ findContours + approxPolyDP自动检测文档边缘。透视校正后,>30°角度拍摄的OCR准确率提高20–30%。

kotlin
// CLAHE + OpenCV预处理
val mat = Mat()
Utils.bitmapToMat(bitmap, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)

val clahe = Imgproc.createCLAHE(2.0, Size(8.0, 8.0))
clahe.apply(mat, mat)

Imgproc.GaussianBlur(mat, mat, Size(3.0, 3.0), 0.0)
Imgproc.threshold(mat, mat, 0.0, 255.0, Imgproc.THRESH_BINARY or Imgproc.THRESH_OTSU)

val processedBitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(mat, processedBitmap)

OCR前的文本检测 — 对于场景文本,在传递给OCR之前使用EAST(Efficient Accurate Scene Text Detector)或CRAFT(Character Region Awareness for Text Detection)。EAST在5–15毫秒内检测场景中文本的bounding box。CRAFT更准确(97%),但速度较慢(50–100毫秒)。文本检测可以裁剪掉没有文本的区域,只将相关部分传递给OCR,从而加速整体处理。

OCR在移动应用中的应用

文档扫描 — OCR最广泛的应用。扫描应用(CamScanner、Adobe Scan、Google Drive)使用ML Kit或Vision从文档照片中识别文本。典型pipeline:检测文档边缘→透视校正→CLAHE处理→OCR→格式化(PDF、DOCX)。ML Kit Text Recognition V2在100–200毫秒内处理A4页面。

实时文本翻译 — OCR和机器翻译的结合。Google Translate、Microsoft Translator、Yandex Translate使用ML Kit或Vision从相机识别文本,并将翻译叠加在原始文本上(AR翻译)。要求:延迟< 200毫秒以获得舒适的体验。ML Kit V2 + NNAPI每帧提供30–80毫秒,为翻译和渲染留出余量。

自动数据输入 — OCR用于从名片、银行卡、身份证中提取数据。ML Kit识别文本,然后后处理解析结构:姓名、电话、电子邮件(名片)或卡号、有效期、CVV(支付卡)。对于名片,在OCR后使用正则表达式。对于银行卡 — 专门的ML模型(付费,~99%准确率)。

swift
// OCR + AR翻译(简化版)
let request = VNRecognizeTextRequest { req, _ in
    guard let results = req.results as? [VNRecognizedTextObservation] else { return }
    for observation in results {
        let text = observation.topCandidates(1).first?.string ?? ""
        let rect = observation.boundingBox
        // 翻译和AR在矩形上的渲染
        DispatchQueue.main.async {
            overlayView.showTranslation(text, at: rect)
        }
    }
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false

为视障人士提供的OCR — 辅助技术:应用从包装、菜单、标牌上朗读文本。使用ML Kit OCR + Text-to-Speech(Android TTS / iOS AVSpeechSynthesizer)。关键要求 — 低延迟实时(< 100毫秒)。Seeing AI(Microsoft)和Envision AI使用这种方法。对于无障碍应用,使用fast recognition模式,不要按confidence过滤 — 每个文本对用户都很重要。

常见问题

移动应用中的Text Recognition(OCR)是什么?

Text Recognition(OCR) — 允许应用从照片和视频中"阅读"文本的技术。智能手机摄像头捕捉图像,设备上的神经网络识别字符并返回机器可读的文本。在移动应用中,OCR用于扫描文档、相机翻译、从名片输入数据以及为视障人士创建无障碍界面。

Android哪个OCR更好:ML Kit还是Tesseract?

ML Kit Text Recognition — Android的最佳选择:96%准确率、10–30毫秒速度、45种语言、通过NNAPI实现GPU加速、找到任何方向的文本。Tesseract — 开源替代方案(90%准确率、100+种语言、CPU),适用于没有Google Play的设备或稀有语言。在95%的项目中,选择ML Kit — 它更快、更准确,并且不需要图像预处理。

移动设备上的OCR需要互联网吗?

不需要,ML Kit Text Recognition、Apple Vision和Tesseract完全在设备上运行。ML Kit可以在首次启动时下载模型(downloaded模式),之后离线工作。Apple Vision内置于iOS,不需要互联网。Tesseract完全离线。云OCR(Google Cloud Vision、AWS Textract)通过互联网工作,但不用于移动实时应用。

ML Kit Text Recognition支持哪些语言?

ML Kit Text Recognition V2支持45+种拉丁和西里尔语系语言:英语、俄语、德语、法语、西班牙语、意大利语、葡萄牙语、波兰语、乌克兰语、罗马尼亚语、土耳其语等。V1(CJK)还支持中文、日语、韩语。完整列表在TextRecognizerOptions文档中。要识别阿拉伯语或希伯来语,请使用Tesseract(>100种语言)。

如何提高文档照片上OCR的准确率?

主要方法:对齐文档(通过OpenCV进行透视校正)、提高对比度(CLAHE)、去模糊(unsharp mask)、良好照明(continuous auto-exposure)、相机稳定(OIS/EIS)。ML Kit自行处理基本畸变,但对于有透视畸变(>30°)的文档,预处理可将准确率提高20–30%。对于视频,使用fast recognition模式。

总结

  • Text Recognition — 移动设备上的OCR:印刷体、手写体、场景文本
  • ML Kit V2 — 96%准确率、45+种语言、10–30毫秒、GPU/NPU加速
  • Apple Vision — 原生iOS OCR(iOS 13+)、13种语言、通过ANE
  • Tesseract 5 — 开源、100+种语言、50–200毫秒(CPU)、华为的备选方案
  • 预处理 — CLAHE、deskew、透视校正将准确率提高10–30%
  • Real-time — 使用ML Kit或Vision通过CameraX/AVFoundation可达30 FPS
  • On-device — 所有计算均在本地,数据隐私有保障

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读