用Swift 结合 Tesseract OCR 进行验证码识别
- 环境准备
1.1 安装 Tesseract OCR
在 macOS 上,可以使用 Homebrew 安装:
brew install tesseract
安装完成后,检查版本:
tesseract --version
1.2 创建 Swift 项目
使用 Swift Package Manager (SPM) 创建一个新项目:
mkdir SwiftOCR
cd SwiftOCR
swift package init --type executable
1.3 添加依赖
在 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.1.0")
],
targets: [
.executableTarget(
name: "SwiftOCR",
dependencies: ["SwiftyTesseract"]
)
]
)
然后运行:
swift build
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()
let rect = NSRect(origin: .zero, size: image.size)
image.draw(in: rect, from: rect, operation: .sourceOver, fraction: 1.0)
NSColor.black.set()
UIRectFillUsingBlendMode(rect, .destinationIn)
grayscaleImage.unlockFocus()
return grayscaleImage
}
func recognizeCaptcha(imagePath: String) {
guard let image = preprocessImage(imagePath: imagePath) else {
return
}
let tesseract = SwiftyTesseract(language: .english)
tesseract.performOCR(on: image) { result in
switch result {
case .success(let text):
print("识别出的验证码: \(text.trimmingCharacters(in: .whitespacesAndNewlines))")
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: image) { result in ... }
调用 SwiftyTesseract 进行 OCR 识别
使用 .english 提高验证码识别率
输出识别结果
- 运行程序
确保 captcha.png 存在,然后运行:
swift run
程序会加载验证码图片,进行处理,并输出识别出的文本。
- 提高 OCR 识别率
优化 Tesseract 配置
let tesseract = SwiftyTesseract(language: .custom("eng"))
tesseract.engineMode = .tesseractLstmCombined
tesseract.pageSegmentationMode = .singleLine
去除噪点(可以使用 Core Image 进行形态学处理)
浙公网安备 33010602011771号