用 Swift 解析验证码(结合 Tesseract OCR)

news/2025/11/9 17:20:37/文章来源:https://www.cnblogs.com/ocr12/p/19204523
  1. 环境准备
    1.1 安装 Swift

macOS 自带 Swift,如需更新,可使用:
更多内容访问ttocr.com或联系1436423940
xcode-select --install

然后检查 Swift 版本:

swift --version

Linux 用户可以从 Swift 官方网站
下载对应版本,并按照说明安装。

1.2 安装 Tesseract OCR
macOS(Homebrew 安装)
brew install tesseract

Linux(Ubuntu 示例)
sudo apt update
sudo apt install tesseract-ocr -y

Windows

Windows 用户可以从 Tesseract 官方 GitHub
下载并安装 Tesseract,并配置环境变量。

检查 Tesseract 是否安装成功:

tesseract --version

1.3 创建 Swift 项目
mkdir SwiftOCR
cd SwiftOCR
swift package init --type executable

然后,在 Package.swift 中添加 Tesseract 相关依赖:

// swift-tools-version:5.5
import PackageDescription

let package = Package(
name: "SwiftOCR",
dependencies: [
.package(url: "https://github.com/gali8/Tesseract-OCR-iOS.git", from: "4.0.0")
],
targets: [
.executableTarget(
name: "SwiftOCR",
dependencies: ["Tesseract-OCR-iOS"]
)
]
)

运行:

swift build

  1. 代码实现

编辑 Sources/SwiftOCR/main.swift,写入以下代码:

import Foundation
import TesseractOCR

// 图像预处理
func preprocessImage(inputPath: String, outputPath: String) {
guard let image = NSImage(contentsOfFile: inputPath) else {
print("无法打开图片")
return
}

// 转换为灰度图像
let grayscaleImage = CIImage(data: image.tiffRepresentation!)?.applyingFilter("CIPhotoEffectMono")// 二值化处理
let context = CIContext()
if let outputImage = grayscaleImage, let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {let processedImage = NSImage(cgImage: cgImage, size: image.size)// 保存处理后的图像let data = processedImage.tiffRepresentationtry? data?.write(to: URL(fileURLWithPath: outputPath))
}

}

// 识别验证码
func recognizeCaptcha(imagePath: String) -> String {
if let tesseract = G8Tesseract(language: "eng") {
tesseract.engineMode = .tesseractOnly
tesseract.pageSegmentationMode = .singleLine
tesseract.image = NSImage(contentsOfFile: imagePath)
tesseract.recognize()
return tesseract.recognizedText ?? "识别失败"
}
return "初始化失败"
}

let inputImage = "captcha.png" // 你的验证码图片路径
let processedImage = "processed_captcha.png"

// 预处理验证码图像
preprocessImage(inputPath: inputImage, outputPath: processedImage)

// OCR 识别
let result = recognizeCaptcha(imagePath: processedImage)
print("识别出的验证码: (result)")

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

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

转换为灰度图像:

let grayscaleImage = CIImage(data: image.tiffRepresentation!)?.applyingFilter("CIPhotoEffectMono")

二值化处理(增强对比度):

if let outputImage = grayscaleImage, let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
let processedImage = NSImage(cgImage: cgImage, size: image.size)
}

保存处理后的图像:

let data = processedImage.tiffRepresentation
try? data?.write(to: URL(fileURLWithPath: outputPath))

3.2 OCR 解析

初始化 Tesseract OCR:

if let tesseract = G8Tesseract(language: "eng") {

设置 OCR 识别模式(PSM 6 适用于验证码):

tesseract.pageSegmentationMode = .singleLine

加载验证码图像并执行 OCR 识别:

tesseract.image = NSImage(contentsOfFile: imagePath)
tesseract.recognize()

获取识别结果:

tesseract.recognizedText ?? "识别失败"

  1. 运行程序

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

swift run

示例输出:

识别出的验证码: X9GH5

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

Tesseract 提供了不同的页面分割模式:

tesseract.pageSegmentationMode = .singleChar

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

PSM 7:只检测单个文本行

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

5.2 只识别特定字符

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

tesseract.charWhitelist = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

5.3 进一步优化

降噪处理:可以使用 Core Image 的 CIMinimumComponent 或 CIColorControls 来提高对比度

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

使用深度学习:如果 Tesseract 不能满足需求,可以结合 Core ML 或 TensorFlow Lite 进行训练,提高验证码识别成功率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift 进行验证码识别:集成 Tesseract OCR

环境准备 1.1 安装 Tesseract OCR在 macOS 上可以使用 Homebrew 进行安装: brew install tesseract 更多内容访问ttocr.com或联系1436423940 安装完成后,检查 Tesseract 是否安装成功: tesseract --version 1.2 创建…

【Linux环境编程】2. Linux核心指令(上)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

700.二叉搜索树中的搜索(二叉树算法) - 实践

700.二叉搜索树中的搜索(二叉树算法) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

egg-passport 的原理, 是否依赖数据库

egg-passport 的原理, 是否依赖数据库原理 egg-passport 是 Egg.js 框架基于 Passport.js 实现的身份认证插件,其核心原理是:集成 Passport.js 生态基于 Passport.js 的策略(Strategy)机制,支持多种身份认证方式(…

P10194 [USACO24FEB] Milk Exchange G 做题记录

思路(暴力 1) 我们可以先想一个最简单的暴力:遍历每一秒,每一秒的时候遍历每个奶牛来模拟题意。 但是发现这样的暴力没有优化的前景,考虑换一种暴力。 思路(暴力 2) 可以先假设每个奶牛的容量都一样大,那么所有…

egg-sequelize 原理, 访问 sequelize 的方式, 支持情况

egg-sequelize 原理, 访问 sequelize 的方式, 支持情况主要功能 egg-sequelize 是 Egg.js 的 Sequelize 插件,主要作用是:集成 Sequelize ORM 到 Egg.js 框架中提供模型自动加载机制支持多数据源配置简化数据库操作与…

Pandas - No difference between Pandas isna() function and isnull()

Pandas - No difference between Pandas isna() function and isnull()The isna() and isnull() functions in Pandas are essentially identical in functionality. Both are used to detect missing or NA (Not Avai…

2025CCPC哈尔滨站游记

总结:三个人在那边搞笑。。。 一开始我一直在搞F,其他两人: xsh: A我会了。 然后切了。 wyx:M很简单。 然后去打代码。 wyx:好像不简单,没事,L很简单。 然后又去打代码,然后调不出来了。 我此时已经发现了 F 题…

创建conda环境时将要安装的一些软件包分析

创建conda环境时将要安装的一些软件包分析核心包python-3.11.14: Python解释器主程序,3.11 版本比 3.13 版本更稳定,科学计算库支持更好pip-25.2: Python的包管理工具,用于从 PyPI 安装第三方包setuptools-80.9.0: …

图书馆管理系统需求规格说明书

图书馆管理系统需求规划设计书 1.系统概述 1.1 项目背景 本项目旨在开发一个现代化的图书馆管理系统,解决传统图书馆管理中存在的查询繁琐、人工操作效率低、读者服务体验差等问题。 1.2 项目目标 实现图书馆业务的全…

含错方程与非线性滤波模型的逼近攻击

对序列密码线性滤波模型的攻击:https://www.cnblogs.com/luminescence/p/19204373 一、问题描述 1. 非线性滤波模型结构 L 级本原 LFSR ↓ 状态序列 \(S^{(i)} = (s_0^{(i)}, s_1^{(i)}, ..., s_{L-1}^{(i)})\) ↓ 非…

重生之我在大学自学鸿蒙构建第一天-《基础篇》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

点云配准基础知识

引言 什么是点云配准呢,我们分别看下点云和配准点云:你可以想象成 “3D 世界的像素”—— 比如用激光雷达扫描一个桌子,会得到成千上万的 3D 坐标点(每个点有 X、Y、Z 位置信息),这些点凑在一起就形成了桌子的 “…

完整教程:Android监听第三方播放获取音乐信息及包名

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

git的各种HEAD以及使用示例

gitrevisions - git docs git-rev-parse - git docs中文 HEAD 命名工作区中的更改所基于的提交。 这个很常用了,HEAD为当前分支最新提交,经常用HEAD^、HEAD^^^、HEAD~n来定位之前的提交。 # 清除工作区和暂存区的所有…

OneDrive上传和下载速度慢?有什么解决办法吗? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

win10安装广东省正版化检查工具

win10安装广东省正版化检查工具这个工具如果用管理员账户进行默认安装,启动后加载是不会弹出用户账户控制的,但如果切换到标准用户,启动则会弹出用户账户控制,需要管理员授权才能启动。 经过尝试,发现除了要禁用系…

详细介绍:深入浅出MATLAB数据可视化:超越plot()

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式 - 详解

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

既然道可道相当道,那么传道授业解惑的根基是什么?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …