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

  1. 环境准备
    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 提高验证码识别率

输出识别结果

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

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

  1. 提高 OCR 识别率
    优化 Tesseract 配置

let tesseract = SwiftyTesseract(language: .custom("eng"))
tesseract.engineMode = .tesseractLstmCombined
tesseract.pageSegmentationMode = .singleLine
去除噪点(可以使用 Core Image 进行形态学处理)

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