- 环境准备
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 进行依赖管理。
- 代码实现
在 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 = .tesseractOnlytesseract.pageSegmentationMode = .singleLinetesseract.image = imagetesseract.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 训练数据
- 运行项目
确保 captcha.png 存在于 Assets 目录中,然后运行 Xcode 项目,你将会在控制台看到验证码识别结果。