1. 环境准备
1.1 安装 Xcode
在 macOS 上开发 Swift 代码,建议安装最新版 Xcode,可以通过 App Store 下载。
1.2 安装 Tesseract OCR
在 macOS 上,我们可以使用 Homebrew 安装 Tesseract:
brew install tesseract
然后检查安装是否成功:
tesseract --version
1.3 添加 Tesseract OCR Swift 库
我们使用 TesseractOCRiOS 作为 Swift 绑定库,在 Xcode 项目的 Podfile 中添加:
pod 'TesseractOCRiOS'
然后运行:
pod install
确保你的 Xcode 项目使用 CocoaPods 进行依赖管理。
2. 代码实现
在 Swift 项目中,创建一个新的 Swift 文件 OCRProcessor.swift,并添加以下代码:
import UIKit
import TesseractOCR
class OCRProcessor {
/// 预处理图像:灰度化 + 二值化
func preprocessImage(_ image: UIImage) -> UIImage? {
guard let cgImage = image.cgImage else { return nil }
let ciImage = CIImage(cgImage: cgImage)
// 应用灰度滤镜
let grayscaleFilter = CIFilter(name: "CIColorControls")
grayscaleFilter?.setValue(ciImage, forKey: kCIInputImageKey)
grayscaleFilter?.setValue(0.0, forKey: kCIInputSaturationKey)
// 应用二值化处理
let thresholdFilter = CIFilter(name: "CIThresholdToAlpha")
thresholdFilter?.setValue(grayscaleFilter?.outputImage, forKey: kCIInputImageKey)
if let outputImage = thresholdFilter?.outputImage {
let context = CIContext()
if let cgImageResult = context.createCGImage(outputImage, from: outputImage.extent) {
return UIImage(cgImage: cgImageResult)
}
}
return nil
}
/// OCR 识别验证码
func recognizeText(from image: UIImage) -> String? {
guard let tesseract = G8Tesseract(language: "eng") else { return nil }
tesseract.engineMode = .tesseractOnly
tesseract.pageSegmentationMode = .singleLine
tesseract.image = image
tesseract.recognize()
return tesseract.recognizedText
}
}
3. 代码解析
3.1 预处理图像
灰度化处理 通过 CIColorControls 去除颜色干扰:
grayscaleFilter?.setValue(0.0, forKey: kCIInputSaturationKey)
二值化(Thresholding) 提高字符对比度:
let thresholdFilter = CIFilter(name: "CIThresholdToAlpha")
3.2 OCR 解析
加载 Tesseract OCR:
guard let tesseract = G8Tesseract(language: "eng") else { return nil }
设定 Tesseract 识别模式:
tesseract.engineMode = .tesseractOnly
tesseract.pageSegmentationMode = .singleLine
执行 OCR 识别:
tesseract.image = image
tesseract.recognize()
4. 运行 OCR 识别
在 ViewController 中调用 OCR 处理类:
import UIKit
class ViewController: UIViewController {
let ocrProcessor = OCRProcessor()
override func viewDidLoad() {
super.viewDidLoad()
if let image = UIImage(named: "captcha.png") {
if let processedImage = ocrProcessor.preprocessImage(image) {
if let recognizedText = ocrProcessor.recognizeText(from: processedImage) {
print("识别出的验证码: \(recognizedText)")
} else {
print("OCR 识别失败")
}
}
}
}
}
5. 提高 OCR 识别率
5.1 选择更合适的 PSM
更多内容访问ttocr.com或联系1436423940
tesseract.pageSegmentationMode = .singleChar
适用于单字符验证码,提高精准度。
5.2 进一步优化图像
去噪
字符分割
使用更好的 Tesseract 训练数据
6. 运行项目
确保 captcha.png 存在于 Assets 目录中,然后运行 Xcode 项目,你将会在控制台看到验证码识别结果。