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

1. 环境准备

1.1 安装 Tesseract OCR

在 macOS 上,可以使用 Homebrew 安装 Tesseract:

 
 

brew install tesseract

安装完成后,检查版本:

 
 

tesseract --version

1.2 创建 Swift 项目

使用 Swift Package Manager(SPM)创建一个新项目:

 
 

mkdir SwiftOCR cd SwiftOCR swift package init --type executable

1.3 添加 Tesseract OCR 依赖

Package.swift 文件中添加 SwiftyTesseract 作为依赖:

 
 

// swift-tools-version:5.5 import PackageDescription let package = Package( name: "SwiftOCR", dependencies: [ .package(url: "https://github.com/SwiftyTesseract/SwiftyTesseract.git", from: "3.2.0") ], targets: [ .target( name: "SwiftOCR", dependencies: ["SwiftyTesseract"] ), .executableTarget( name: "SwiftOCRApp", dependencies: ["SwiftOCR"] ) ] )

然后运行:

 
 

swift package update


2. 代码实现

Sources/SwiftOCR/main.swift 文件中编写如下代码:

 
 

import Foundation import SwiftyTesseract import AppKit func preprocessImage(imagePath: String) -> NSImage? { guard let image = NSImage(contentsOfFile: imagePath) else { print("无法加载图像") return nil } // 将图像转换为灰度(可选的预处理步骤) let grayScaleImage = NSImage(size: image.size) grayScaleImage.lockFocus() NSColor.gray.set() image.draw(at: .zero, from: NSRect(origin: .zero, size: image.size), operation: .sourceIn, fraction: 1.0) grayScaleImage.unlockFocus() return grayScaleImage } func recognizeCaptcha(imagePath: String) { guard let processedImage = preprocessImage(imagePath: imagePath) else { return } let tesseract = SwiftyTesseract(language: .english) tesseract.performOCR(on: processedImage) { result in switch result { case .success(let text): print("识别出的验证码: \(text)") case .failure(let error): print("OCR 识别失败: \(error)") } } } let imagePath = "captcha.png" recognizeCaptcha(imagePath: imagePath)


3. 代码解析

3.1 预处理验证码

 
 

func preprocessImage(imagePath: String) -> NSImage?

  • 加载图像

  • 转换为灰度,提高 OCR 识别率

3.2 OCR 解析

 
 

let tesseract = SwiftyTesseract(language: .english) tesseract.performOCR(on: processedImage) { result in ... }

  • 调用 SwiftyTesseract 进行 OCR 识别

  • 输出识别结果


4. 运行程序

确保 captcha.png 存在,然后运行:

 
 

swift run

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


5. 提高 OCR 识别率

  • 设置 Tesseract 识别模式

 
 

tesseract.customVariables = [("tessedit_pageseg_mode", "6")]

  • 使用自定义训练数据

 
 

tesseract.customWords = ["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"]

  • 去除噪点(可以使用 Core Image 进行处理)