Swift 解析验证码(结合 Tesseract OCR)

  1. 环境准备
    1.1 安装 Xcode 和 Swift
    如果尚未安装 Xcode,可以在 Mac App Store 下载 Xcode,并确保 Swift 可用:

bash

swift --version
1.2 安装 Tesseract OCR
使用 Homebrew 安装:

brew install tesseract
安装完成后,检查 Tesseract 是否安装成功:

bash

tesseract --version
1.3 添加 Tesseract OCR 依赖
在 Swift 项目中使用 Tesseract OCR for iOS,可以通过 CocoaPods 或 Swift Package Manager (SPM) 进行集成。

使用 CocoaPods
如果尚未安装 CocoaPods:

bash

sudo gem install cocoapods
创建 Podfile 并添加 Tesseract 依赖:

ruby

platform :ios, '13.0'
use_frameworks!

target 'CaptchaOCR' do
pod 'TesseractOCRiOS'
end
然后运行:

bash

pod install
使用 Xcode 打开 CaptchaOCR.xcworkspace。

使用 Swift Package Manager (SPM)
在 Xcode 中:

进入 File > Swift Packages > Add Package Dependency
输入 https://github.com/gali8/Tesseract-OCR-iOS.git
选择 最新版本,然后添加到项目中
2. 代码实现
创建 CaptchaOCR.swift 并添加以下代码:

swift

import UIKit
import TesseractOCR

class CaptchaOCR {

// 预处理验证码图像
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) // 设为灰度
    grayscaleFilter.setValue(1.2, forKey: kCIInputContrastKey) // 增强对比度
    
    guard let outputImage = grayscaleFilter.outputImage else { return nil }
    let context = CIContext()
    guard let cgResult = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }
    
    return UIImage(cgImage: cgResult)
}

// 使用 Tesseract OCR 进行识别
func recognizeCaptcha(image: UIImage, completion: @escaping (String?) -> Void) {
    DispatchQueue.global(qos: .userInitiated).async {
        if let tesseract = G8Tesseract(language: "eng") {
            tesseract.engineMode = .tesseractOnly
            tesseract.pageSegmentationMode = .singleLine
            tesseract.image = image
            tesseract.recognize()
            
            DispatchQueue.main.async {
                completion(tesseract.recognizedText?.trimmingCharacters(in: .whitespacesAndNewlines))
            }
        } else {
            DispatchQueue.main.async {
                completion(nil)
            }
        }
    }
}

}

// 示例调用
let captchaOCR = CaptchaOCR()
if let image = UIImage(named: "captcha.png") {
if let processedImage = captchaOCR.preprocessImage(image: image) {
captchaOCR.recognizeCaptcha(image: processedImage) { result in
print("识别出的验证码: (result ?? "失败")")
}
}
}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码进行优化:

转换为灰度图像:
swift

grayscaleFilter.setValue(0.0, forKey: kCIInputSaturationKey)
增强对比度:
swift

grayscaleFilter.setValue(1.2, forKey: kCIInputContrastKey)
3.2 OCR 解析
初始化 Tesseract OCR:
swift

if let tesseract = G8Tesseract(language: "eng") {
设置识别模式:
swift

tesseract.pageSegmentationMode = .singleLine
执行 OCR 识别:
swift

tesseract.recognize()
获取识别结果:
swift

completion(tesseract.recognizedText?.trimmingCharacters(in: .whitespacesAndNewlines))
4. 运行程序
如果是 iOS 项目,可以在 ViewController.swift 中调用:

swift

override func viewDidLoad() {
super.viewDidLoad()

let captchaOCR = CaptchaOCR()
if let image = UIImage(named: "captcha.png") {
    if let processedImage = captchaOCR.preprocessImage(image: image) {
        captchaOCR.recognizeCaptcha(image: processedImage) { result in
            print("识别出的验证码: \(result ?? "失败")")
        }
    }
}

}
5. 提高 OCR 识别率
5.1 选择合适的 PSM 模式
Tesseract 提供了不同的页面分割模式:

swift

tesseract.pageSegmentationMode = .singleChar // 适用于单字符验证码
PSM 6:适用于单行文本(推荐)
PSM 7:处理单个文本行
PSM 10:单字符模式(适用于单字符验证码)
5.2 只识别特定字符
如果验证码仅包含字母和数字:

swift

tesseract.charWhitelist = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
5.3 进一步优化
降噪处理:可以使用 OpenCV for Swift 进行去噪优化
字符分割:如果验证码字符粘连,可尝试 OpenCV 进行字符分割
使用 CoreML 深度学习:如果 Tesseract 不能满足需求,可以结合 CoreML 训练自定义 OCR 识别模型

posted @ 2025-03-19 19:16  ttocr、com  阅读(24)  评论(0)    收藏  举报