用 Swift 结合 Tesseract OCR 进行验证码识别
一、背景介绍
Swift 是苹果推出的现代编程语言,广泛应用于 iOS 和 macOS 开发。在移动应用中,有时需要自动化识别验证码,如自动填充或批量数据录入。本文将介绍如何使用 Swift 结合 Tesseract OCR 进行验证码识别。
二、环境准备
2.1 安装 Tesseract
在 macOS 上使用 Homebrew 安装:
brew install tesseract
验证安装:
tesseract --version
2.2 创建 Swift 项目
使用 Xcode 创建一个新的命令行工具项目,语言选择 Swift。
2.3 添加依赖
使用 Carthage 来集成 Tesseract:
brew install carthage
在项目目录下创建 Cartfile:
github "gali8/Tesseract-OCR-iOS"
安装依赖:
carthage update --platform iOS
三、代码实现
3.1 图像预处理函数
预处理验证码图像(灰度和二值化):
import Foundation
import UIKit
import TesseractOCR
func preprocessImage(image: UIImage) -> UIImage? {
guard let cgImage = image.cgImage else { return nil }
let ciImage = CIImage(cgImage: cgImage)
// 转换为灰度
let grayscaleFilter = CIFilter(name: "CIColorControls")
grayscaleFilter?.setValue(ciImage, forKey: kCIInputImageKey)
grayscaleFilter?.setValue(0.0, forKey: kCIInputSaturationKey)
guard let grayImage = grayscaleFilter?.outputImage else { return nil }
// 二值化处理
let thresholdFilter = CIFilter(name: "CIThresholdToZero")
thresholdFilter?.setValue(grayImage, forKey: kCIInputImageKey)
thresholdFilter?.setValue(0.5, forKey: "inputThreshold")
guard let binaryImage = thresholdFilter?.outputImage else { return nil }
let context = CIContext()
guard let outputCGImage = context.createCGImage(binaryImage, from: binaryImage.extent) else { return nil }
return UIImage(cgImage: outputCGImage)
}
3.2 识别验证码的函数
使用 Tesseract 进行验证码识别:
func recognizeCaptcha(image: UIImage) {
guard let tesseract = G8Tesseract(language: "eng") else {
print("初始化 Tesseract 失败")
return
}
tesseract.engineMode = .tesseractOnly
tesseract.pageSegmentationMode = .singleLine
tesseract.image = preprocessImage(image: image)
tesseract.charWhitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
tesseract.recognize()
if let text = tesseract.recognizedText {
print("识别出的验证码: \(text)")
} else {
print("识别失败")
}
}
四、调用程序
4.1 主程序入口
func main() {
if let captchaImage = UIImage(named: "captcha.png") {
recognizeCaptcha(image: captchaImage)
} else {
print("无法加载验证码图片")
}
}
main()
五、运行程序
在 Xcode 中运行项目,查看控制台输出:
识别出的验证码: 8G2HD
六、识别优化
调整 PSM 模式: 使用合适的页面分割模式,如 .singleLine 或 .singleBlock。
字符集限制: 通过设置 charWhitelist 提高准确率。
图像增强: 结合高斯模糊和锐化操作,进一步去除噪声。
浙公网安备 33010602011771号