使用 Swift 和 Tesseract OCR 解析验证码

  1. 环境准备
    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 = processedImage
    tess.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
程序会加载验证码图像,进行预处理,并输出识别的文本。

  1. 提高 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)

posted @ 2025-03-20 16:11  ttocr、com  阅读(15)  评论(0)    收藏  举报