使用 Swift 结合 Tesseract 进行验证码识别


1. 环境准备
1.1 安装 Xcode 和 Homebrew
如果你使用的是 macOS,建议使用 Xcode 进行开发,并通过 Homebrew 安装 Tesseract:

xcode-select --install
brew install tesseract
检查 Tesseract 是否安装成功:

tesseract --version
1.2 创建 Swift 项目
可以使用 Swift Package Manager(SPM)创建一个新的 Swift 项目:

mkdir SwiftOCR
cd SwiftOCR
swift package init --type executable
1.3 添加 Tesseract 依赖
编辑 Package.swift,添加 SwiftTesseract 作为依赖:

// swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "SwiftOCR",
    dependencies: [
        .package(url: "https://github.com/gali8/Tesseract-OCR-iOS.git", from: "5.4.0")
    ],
    targets: [
        .executableTarget(
            name: "SwiftOCR",
            dependencies: ["TesseractOCR"]
        )
    ]
)
然后运行:

swift build
2. 代码实现
在 Sources/SwiftOCR/main.swift 中编写以下代码:

import Foundation
import UIKit
import TesseractOCR

// 处理图像,转换为黑白,去噪
func preprocessImage(image: UIImage) -> UIImage? {
    guard let ciImage = CIImage(image: image) else { return nil }

    let filter = CIFilter(name: "CIColorControls")
    filter?.setValue(ciImage, forKey: kCIInputImageKey)
    filter?.setValue(0.0, forKey: kCIInputSaturationKey) // 转换为灰度
    filter?.setValue(1.5, forKey: kCIInputContrastKey) // 增强对比度

    guard let outputImage = filter?.outputImage else { return nil }
    return UIImage(ciImage: outputImage)
}

// 识别验证码
func recognizeCaptcha(imagePath: String) {
    guard let image = UIImage(contentsOfFile: imagePath) else {
        print("无法加载图片")
        return
    }

    guard let processedImage = preprocessImage(image: image) else {
        print("图像预处理失败")
        return
    }

    if let tesseract = G8Tesseract(language: "eng") {
        tesseract.engineMode = .tesseractOnly
        tesseract.pageSegmentationMode = .singleLine
        tesseract.image = processedImage
        tesseract.recognize()

        if let recognizedText = tesseract.recognizedText {
            print("识别出的验证码: \(recognizedText)")
        } else {
            print("OCR 识别失败")
        }
    }
}

// 运行 OCR 识别
let imagePath = "captcha.png"
recognizeCaptcha(imagePath: imagePath)
3. 代码解析
3.1 预处理验证码

func preprocessImage(image: UIImage) -> UIImage?
转换为灰度图像

调整对比度,增强字符清晰度

去除噪点

3.2 OCR 解析

func recognizeCaptcha(imagePath: String)
使用 G8Tesseract 进行 OCR 识别

输出识别的验证码文本

4. 运行程序
将验证码图片 captcha.png 放入项目目录,然后运行:

swift run
程序会加载验证码图片,进行处理,并输出识别出的文本。

5. 提高 OCR 识别率
调整 Tesseract 参数
更多内容访问ttocr.com或联系1436423940
tesseract.engineMode = .tesseractOnly
tesseract.pageSegmentationMode = .singleLine
使用不同的 OCR 语言

let tesseract = G8Tesseract(language: "eng+osd")
更多图像处理(可以使用 CoreImage 进行更高级的滤波)