Swift 结合 Tesseract OCR 进行验证码识别
- 环境准备
1.1 安装 Xcode 和 Swift
确保你的 macOS 设备上安装了 Xcode:
xcode-select --install
检查 Swift 版本:
swift --version
1.2 安装 Tesseract OCR
使用 Homebrew 安装 Tesseract:
brew install tesseract
安装完成后,检查版本:
tesseract --version
1.3 创建 Swift 项目
创建一个新的 Swift 项目:
mkdir SwiftOCR
cd SwiftOCR
swift package init --type executable
1.4 添加依赖
在 Package.swift 文件中添加 SwiftTesseract 依赖:
// swift-tools-version:5.7
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: ["Tesseract-OCR-iOS"]
)
]
)
然后运行:
swift build
2. 代码实现
在 Sources/SwiftOCR/main.swift 文件中编写如下代码:
import Foundation
import TesseractOCR
import AppKit
// 预处理图像
func preprocessImage(imagePath: String) -> NSImage? {
guard let image = NSImage(contentsOfFile: imagePath) else {
print("无法加载图像")
return nil
}
// 将图像转换为灰度
let grayImage = imageToGrayScale(image: image)
// 保存处理后的图像(可选)
let outputPath = "processed_captcha.png"
saveImage(image: grayImage, path: outputPath)
return grayImage
}
// 灰度化处理
func imageToGrayScale(image: NSImage) -> NSImage {
let ciImage = CIImage(data: image.tiffRepresentation!)
let filter = CIFilter(name: "CIColorControls")!
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(0.0, forKey: kCIInputSaturationKey) // 设为灰度
let outputCIImage = filter.outputImage!
let rep = NSCIImageRep(ciImage: outputCIImage)
let nsImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)
return nsImage
}
// 保存图像
func saveImage(image: NSImage, path: String) {
guard let tiffData = image.tiffRepresentation,
let bitmap = NSBitmapImageRep(data: tiffData),
let pngData = bitmap.representation(using: .png, properties: [:]) else {
return
}
try? pngData.write(to: URL(fileURLWithPath: path))
}
// OCR 识别
func recognizeCaptcha(imagePath: String) {
guard let processedImage = preprocessImage(imagePath: imagePath) else {
return
}
if let tesseract = G8Tesseract(language: "eng") {
tesseract.image = processedImage
tesseract.recognize()
if let recognizedText = tesseract.recognizedText {
print("识别出的验证码: \(recognizedText.trimmingCharacters(in: .whitespacesAndNewlines))")
} else {
print("OCR 识别失败")
}
} else {
print("无法初始化 Tesseract")
}
}
// 运行程序
let imagePath = "captcha.png" // 确保该路径下有验证码图片
recognizeCaptcha(imagePath: imagePath)
3. 代码解析
3.1 预处理验证码
func preprocessImage(imagePath: String) -> NSImage?
加载图像
转换为灰度
保存处理后的图像(可选)
3.2 OCR 解析
if let tesseract = G8Tesseract(language: "eng") {
tesseract.image = processedImage
tesseract.recognize()
}
使用 G8Tesseract 进行 OCR 识别
输出验证码结果
- 运行程序
确保 captcha.png 存在,然后运行:
swift run
程序会加载验证码图片,进行处理,并输出识别出的文本。
- 提高 OCR 识别率
优化 Tesseract 识别参数
tesseract.pageSegmentationMode = .singleLine
tesseract.charWhitelist = "0123456789abcdefghijklmnopqrstuvwxyz"
去除噪点(可以使用 Core Image 进行更多图像处理)
浙公网安备 33010602011771号