当前位置: 首页 > news >正文

Swift 和 Tesseract OCR 解析验证码

  1. 环境准备
    1.1 安装 Swift
    更多内容访问ttocr.com或联系1436423940
    如果你使用的是 macOS,Swift 已经预装在系统中。可以通过以下命令检查 Swift 版本:

swift --version

如果你使用的是 Linux,可以安装 Swift:

sudo apt update
sudo apt install swift

1.2 安装 Tesseract OCR
macOS

使用 Homebrew 安装:

brew install tesseract

Linux (Ubuntu)
sudo apt update
sudo apt install tesseract-ocr libtesseract-dev

Windows

你可以从 Tesseract GitHub
下载适用于 Windows 的安装包,并配置环境变量。

1.3 创建 Swift 项目

创建一个 Swift 命令行项目:

mkdir SwiftOCR
cd SwiftOCR
swift package init --type executable

然后,在 Package.swift 中添加 TesseractOCR 作为依赖:

// 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"])
]
)

  1. 代码实现

在 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 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 = processedImagetess.recognize()return tess.recognizedText
}return nil

}

let imagePath = "captcha.png" // 需替换为你的验证码图像
if let result = recognizeCaptcha(imagePath: imagePath) {
print("识别出的验证码: (result)")
} else {
print("识别失败")
}

  1. 代码解析
    3.1 图像预处理

为了提高 OCR 识别率,我们对验证码图像进行了优化:

转换为灰度图像:去除颜色干扰

二值化处理:增强对比度,使字符更清晰

调整大小(可选):放大字符,提高 OCR 识别率

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:

guard let tess = G8Tesseract(language: "eng") else {
print("无法初始化 Tesseract")
return nil
}

设置 Tesseract 解析参数:

tess.engineMode = .tesseractOnly
tess.pageSegmentationMode = .singleLine
tess.charWhitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

识别验证码:

tess.image = processedImage
tess.recognize()
return tess.recognizedText

  1. 运行程序

确保 captcha.png 存在于项目根目录,然后运行:

swift run

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

  1. 提高 OCR 识别率
    5.1 选择合适的 PSM 模式

Tesseract 提供了不同的页面分割模式(PSM),对于验证码,推荐使用 PSM 7(单行文本):

tess.pageSegmentationMode = .singleLine

其他 PSM 模式:

PSM 6:假设是单行文本(默认)

PSM 7:单行纯文本(适用于验证码)

PSM 10:单字符模式(适用于单字符验证码)

5.2 只识别特定字符

如果验证码仅包含字母和数字:

tess.charWhitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

5.3 进一步优化

降噪处理:可以使用 OpenCV 进行降噪去背景

字符分割:如果验证码字符粘连,可以尝试 OpenCV 进行字符分割

深度学习方案:如果 Tesseract 识别效果不佳,可以结合深度学习模型(如 PaddleOCR 或 EasyOCR)

http://www.jsqmd.com/news/33625/

相关文章:

  • 牛顿迭代法:用几何直觉理解方程求根
  • CRT弹窗接收用户文本输入
  • 2025年11月学习机品牌推荐榜:松鼠AI以黑马姿态崛起!
  • What is difference between credit memo and subsequent credit in SAP
  • 用 Rust 和 Tesseract OCR 解析验证码
  • 题解:AT_abc225_h [ABC225H] Social Distance 2
  • vscode-vue-缩进
  • Apollo场景建议配置指南:充分发挥分布式配置中心优势
  • CSAPP学习笔记
  • 英伟达领投,语音AI初创Uniphore估值25亿美元;ElevenLabs创始人:语音的意义不在准确,而在打动丨日报
  • 解决vscode中直接运行python代码出现的乱码、环境不匹配的问题
  • 数学分析A 定理简单整理(部分)
  • 表相关操作
  • 部分页面统计用户访问时长
  • 单词故事
  • 【Linux笔记】网络部分——Socket编程 UDP搭建网络云服务器与本地虚拟机的基本通信
  • 11月6日日记
  • 102302149赖翊煊数据采集第二次作业
  • ai学习机哪个品牌好?松鼠 AI 双线矩阵:学习机 + 自习室,提分更高效
  • 招聘实习生丨加入我们,共建 RTE 开发者社区
  • 引领未来,智启新程:Compete MIS平台——低代码时代的全能信息化管理解决方案
  • 终端
  • 2025.11.06 - A
  • CF2085D Serval and Kaitenzushi Buffet
  • STM32时钟学习11.6
  • 2025.11.6总结
  • 高级程序语言设计的四次作业
  • 11月6日
  • 2024 暑期模拟赛 #11
  • startctf环境变量注入及强网拟态smallcode特殊解法