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 进行处理)