在 Swift 中实现 OCR(光学字符识别)功能,最常见、最推荐的方式是使用 Apple 自家的 Vision 框架。它从 iOS 13 / macOS 10.15 开始就支持内建的文字识别(VNRecognizeTextRequest),效果良好且无需第三方依赖。
VNRecognizeTextRequest
初始化方法
let request = VNRecognizeTextRequest(completionHandler: yourHandler)
常用属性
1、recognitionLevel:VNRequestTextRecognitionLevel类型,识别精度,.fast 或 .accurate(默认 .accurate);
2、usesLanguageCorrection:Bool类型,是否开启语言纠错(默认 false);
3、recognitionLanguages:[String]类型,设置识别语言,如 [“en-US”]、[“zh-Hans”] 等;
4、customWords:[String]?类型,可选,自定义词典,提升特定词识别准确率;
5、minimumTextHeight:Float类型,最小文字高度(相对于图像高度),默认 0。
6、revision:Int类型,指定使用的 Vision 版本,自动适配系统默认即可;
7、preferredLanguages:[String]类型,系统优先识别语言,Vision 会基于此匹配最佳语言;
8、automaticallyDetectsLanguage:Bool类型,是否自动语言识别(默认 true);
9、usesCPUOnly:Bool类型,是否禁用 GPU 推理,仅使用 CPU(调试或兼容性)。
使用 Apple Vision 框架实现 OCR(iOS/macOS)
1、导入框架
import Vision
import VisionKit // macOS 不需要
2、创建OCR请求
let request = VNRecognizeTextRequest { (request, error) in
guard error == nil else {
print("识别失败:\(error!.localizedDescription)")
return
}
if let observations = request.results as? [VNRecognizedTextObservation] {
for observation in observations {
if let candidate = observation.topCandidates(1).first {
print("识别文字:", candidate.string)
}
}
}
}
request.recognitionLevel = .accurate // 或 .fast
request.usesLanguageCorrection = true
request.recognitionLanguages = ["zh-Hans", "en-US"]
3、传入图像进行识别
guard let cgImage = yourUIImage.cgImage else { return }
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
DispatchQueue.global(qos: .userInitiated).async {
do {
try handler.perform([request])
} catch {
print("执行识别失败:\(error)")
}
}
其他方式
1、Tesseract OCR(第三方)
支持多语言,跨平台,但集成相对复杂。
使用如 SwiftyTesseract,但是现阶段该GitHub库已经不再维护,作者推荐使用Apple Vision 框架的文本识别功能。
2、Firebase ML Kit
支持 iOS,支持更复杂的文档识别(但非纯本地),需要网络。
总结
iOS 13+ / macOS 10.15+系统版本,推荐使用Vision 框架,简洁、安全、本地运行。
iOS 12 以下系统版本,可考虑 Tesseract。
多语言或跨平台需求:可考虑集成 SwiftyTesseract。
相关文章
1、VNRecognizeTextRequest:https://developer.apple.com/documentation/vision/vnrecognizetextrequest
2、Recognizing Text in Images:https://developer.apple.com/documentation/vision/recognizing-text-in-images