- 环境准备
1.1 安装 Swift
如果你使用的是 macOS,Swift 已经预装在系统中。可以通过以下命令检查 Swift 版本:
swift --version
如果你使用的是 Linux,可以安装 Swift:
sudo apt update
sudo apt install swift
1.2 安装 Tesseract OCR
macOS
使用 Homebrew 安装:
bash
brew install tesseract
Linux (Ubuntu)
bash
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
Windows
你可以从 Tesseract GitHub 下载适用于 Windows 的安装包,并配置环境变量。
1.3 创建 Swift 项目
创建一个 Swift 命令行项目:
bash
mkdir SwiftOCR
cd SwiftOCR
swift package init --type executable
然后,在 Package.swift 中添加 TesseractOCR 作为依赖:
swift
// swift-tools-version:5.5
import PackageDescription
let package = Package(
name: "SwiftOCR",
dependencies: [
.package(url: "https://github.com/gali8/Tesseract-OCR-iOS.git", .branch("master"))
],
targets: [
.executableTarget(
name: "SwiftOCR",
dependencies: ["TesseractOCR"])
]
)
2. 代码实现
在 Sources/SwiftOCR/main.swift 中添加以下代码:
swift
import Foundation
import TesseractOCR
import AppKit
func preprocessImage(imagePath: String) -> NSImage? {
guard let image = NSImage(contentsOfFile: imagePath) else {
print("无法加载图像")
return nil
}
let bitmap = NSBitmapImageRep(data: image.tiffRepresentation!)
let width = bitmap!.pixelsWide
let height = bitmap!.pixelsHigh// 创建灰度图像
let grayBitmap = NSBitmapImageRep(bitmapDataPlanes: nil,pixelsWide: width,pixelsHigh: height,bitsPerSample: 8,samplesPerPixel: 1,hasAlpha: false,isPlanar: false,colorSpaceName: .deviceGray,bytesPerRow: width,bitsPerPixel: 8
)for x in 0..<width {for y in 0..<height {let color = bitmap!.colorAt(x: x, y: y)let grayValue = Int(0.299 * Double(color!.redComponent * 255) +0.587 * Double(color!.greenComponent * 255) +0.114 * Double(color!.blueComponent * 255))grayBitmap?.setPixel(&[UInt8(grayValue)], atX: x, y: y)}
}return NSImage(data: grayBitmap!.representation(using: .png, properties: [:])!)
}
func recognizeCaptcha(imagePath: String) -> String? {
guard let tess = G8Tesseract(language: "eng") else {
print("无法初始化 Tesseract")
return nil
}
tess.engineMode = .tesseractOnly
tess.pageSegmentationMode = .singleLine
tess.charWhitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"// 预处理图像
if let processedImage = preprocessImage(imagePath: imagePath) {tess.image = processedImagetess.recognize()return tess.recognizedText
}return nil
}
let imagePath = "captcha.png" // 需替换为你的验证码图像
if let result = recognizeCaptcha(imagePath: imagePath) {
print("识别出的验证码: (result)")
} else {
print("识别失败")
}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码图像进行了优化:
转换为灰度图像:去除颜色干扰
二值化处理:增强对比度,使字符更清晰
调整大小(可选):放大字符,提高 OCR 识别率
swift
let grayValue = Int(0.299 * Double(color!.redComponent * 255) +
0.587 * Double(color!.greenComponent * 255) +
0.114 * Double(color!.blueComponent * 255))
这段代码使用了标准的灰度转换公式,使图像变为黑白。
3.2 OCR 解析
初始化 Tesseract:
swift
guard let tess = G8Tesseract(language: "eng") else {
print("无法初始化 Tesseract")
return nil
}
设置 Tesseract 解析参数:
swift
tess.engineMode = .tesseractOnly
tess.pageSegmentationMode = .singleLine
tess.charWhitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
识别验证码:
swift
tess.image = processedImage
tess.recognize()
return tess.recognizedText
4. 运行程序
确保 captcha.png 存在于项目根目录,然后运行:
bash
swift run
程序会加载验证码图像,进行预处理,并输出识别的文本。
- 提高 OCR 识别率
5.1 选择合适的 PSM 模式
Tesseract 提供了不同的页面分割模式(PSM),对于验证码,推荐使用 PSM 7(单行文本):
swift
tess.pageSegmentationMode = .singleLine
其他 PSM 模式:
PSM 6:假设是单行文本(默认)
PSM 7:单行纯文本(适用于验证码)
PSM 10:单字符模式(适用于单字符验证码)
5.2 只识别特定字符
如果验证码仅包含字母和数字:
swift
tess.charWhitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
5.3 进一步优化
降噪处理:可以使用 OpenCV 进行降噪去背景
字符分割:如果验证码字符粘连,可以尝试 OpenCV 进行字符分割
深度学习方案:如果 Tesseract 识别效果不佳,可以结合深度学习模型(如 PaddleOCR 或 EasyOCR)