Swift 结合 Tesseract OCR 进行验证码识别

  1. 环境准备
    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 识别

输出验证码结果

  1. 运行程序
    确保 captcha.png 存在,然后运行:

swift run
程序会加载验证码图片,进行处理,并输出识别出的文本。

  1. 提高 OCR 识别率
    优化 Tesseract 识别参数

tesseract.pageSegmentationMode = .singleLine
tesseract.charWhitelist = "0123456789abcdefghijklmnopqrstuvwxyz"
去除噪点(可以使用 Core Image 进行更多图像处理)

posted @ 2025-05-25 22:45  ttocr、com  阅读(18)  评论(0)    收藏  举报