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

news/2025/3/19 19:17:17/文章来源:https://www.cnblogs.com/ocr12/p/18781620
  1. 环境准备
    1.1 安装 Xcode 和 Swift
    如果尚未安装 Xcode,可以在 Mac App Store 下载 Xcode,并确保 Swift 可用:

bash

swift --version
1.2 安装 Tesseract OCR
使用 Homebrew 安装:

brew install tesseract
安装完成后,检查 Tesseract 是否安装成功:

bash

tesseract --version
1.3 添加 Tesseract OCR 依赖
在 Swift 项目中使用 Tesseract OCR for iOS,可以通过 CocoaPods 或 Swift Package Manager (SPM) 进行集成。

使用 CocoaPods
如果尚未安装 CocoaPods:

bash

sudo gem install cocoapods
创建 Podfile 并添加 Tesseract 依赖:

ruby

platform :ios, '13.0'
use_frameworks!

target 'CaptchaOCR' do
pod 'TesseractOCRiOS'
end
然后运行:

bash

pod install
使用 Xcode 打开 CaptchaOCR.xcworkspace。

使用 Swift Package Manager (SPM)
在 Xcode 中:

进入 File > Swift Packages > Add Package Dependency
输入 https://github.com/gali8/Tesseract-OCR-iOS.git
选择 最新版本,然后添加到项目中
2. 代码实现
创建 CaptchaOCR.swift 并添加以下代码:

swift

import UIKit
import TesseractOCR

class CaptchaOCR {

// 预处理验证码图像
func preprocessImage(image: UIImage) -> UIImage? {guard let cgImage = image.cgImage else { return nil }let ciImage = CIImage(cgImage: cgImage)// 转换为灰度图像let grayscaleFilter = CIFilter(name: "CIColorControls")!grayscaleFilter.setValue(ciImage, forKey: kCIInputImageKey)grayscaleFilter.setValue(0.0, forKey: kCIInputSaturationKey) // 设为灰度grayscaleFilter.setValue(1.2, forKey: kCIInputContrastKey) // 增强对比度guard let outputImage = grayscaleFilter.outputImage else { return nil }let context = CIContext()guard let cgResult = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }return UIImage(cgImage: cgResult)
}// 使用 Tesseract OCR 进行识别
func recognizeCaptcha(image: UIImage, completion: @escaping (String?) -> Void) {DispatchQueue.global(qos: .userInitiated).async {if let tesseract = G8Tesseract(language: "eng") {tesseract.engineMode = .tesseractOnlytesseract.pageSegmentationMode = .singleLinetesseract.image = imagetesseract.recognize()DispatchQueue.main.async {completion(tesseract.recognizedText?.trimmingCharacters(in: .whitespacesAndNewlines))}} else {DispatchQueue.main.async {completion(nil)}}}
}

}

// 示例调用
let captchaOCR = CaptchaOCR()
if let image = UIImage(named: "captcha.png") {
if let processedImage = captchaOCR.preprocessImage(image: image) {
captchaOCR.recognizeCaptcha(image: processedImage) { result in
print("识别出的验证码: (result ?? "失败")")
}
}
}
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码进行优化:

转换为灰度图像:
swift

grayscaleFilter.setValue(0.0, forKey: kCIInputSaturationKey)
增强对比度:
swift

grayscaleFilter.setValue(1.2, forKey: kCIInputContrastKey)
3.2 OCR 解析
初始化 Tesseract OCR:
swift

if let tesseract = G8Tesseract(language: "eng") {
设置识别模式:
swift

tesseract.pageSegmentationMode = .singleLine
执行 OCR 识别:
swift

tesseract.recognize()
获取识别结果:
swift

completion(tesseract.recognizedText?.trimmingCharacters(in: .whitespacesAndNewlines))
4. 运行程序
如果是 iOS 项目,可以在 ViewController.swift 中调用:

swift

override func viewDidLoad() {
super.viewDidLoad()

let captchaOCR = CaptchaOCR()
if let image = UIImage(named: "captcha.png") {if let processedImage = captchaOCR.preprocessImage(image: image) {captchaOCR.recognizeCaptcha(image: processedImage) { result inprint("识别出的验证码: \(result ?? "失败")")}}
}

}
5. 提高 OCR 识别率
5.1 选择合适的 PSM 模式
Tesseract 提供了不同的页面分割模式:

swift

tesseract.pageSegmentationMode = .singleChar // 适用于单字符验证码
PSM 6:适用于单行文本(推荐)
PSM 7:处理单个文本行
PSM 10:单字符模式(适用于单字符验证码)
5.2 只识别特定字符
如果验证码仅包含字母和数字:

swift

tesseract.charWhitelist = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
5.3 进一步优化
降噪处理:可以使用 OpenCV for Swift 进行去噪优化
字符分割:如果验证码字符粘连,可尝试 OpenCV 进行字符分割
使用 CoreML 深度学习:如果 Tesseract 不能满足需求,可以结合 CoreML 训练自定义 OCR 识别模型

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

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

相关文章

day:25 selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3…

[算法学习记录] [更新中]最短路

顾名思义,最短路算法,就是求一个图中所有的点距某一个点的最短距离,常见的有Dijkstra算法、Bellman-Ford算法、Johnson算法与Floyd算法。 Dijkstra Dijistra算法实际上是一种由贪心与动态规划结合的算法,我们每次都贪心地选择到某个点的最近距离,又动态地更新着距离数组d的…

day6-static静态变量

静态变量/静态方法 被static修饰 工具类静态方法不能调用非静态。 非静态可以访问所有。 继承一个子类只能继承一个父类,可以多层继承,最大的父类为Objectcoding 练习:更好的方法:双指针不浪费空间

SpringBoot引入JWT实现用户校验

一JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这些信息以JSON对象的形式存储在令牌中,并且可以被签名和加密。JWT通常用于身份验证和信息交换主要用途 身份验证:当用户登录成功后,服务器会生成一个JWT并返回给客户端。之后…

mcp-playwright测评

mcp-playwright介绍 mcp-playwright是一个使用 Playwright 提供浏览器自动化能力的模型上下文协议服务器。该服务器使 LLMs 能够与网页交互、截屏,并在真实的浏览器环境中执行 JavaScript。 GitHub地址:https://github.com/executeautomation/mcp-playwright。安装 npm insta…

传媒行业项目管理全解析:日事清在流程、文件、数据与风控中的一体化应用

一、关于森可文化 森可文化传媒有限公司(Senke Vision)占据了超过2800平方米的宽敞办公及拍摄场地,与众多内衣及服饰行业的上市巨头建立了不可动摇的深度合作关系。 Senke Vision汇聚了国内外顶尖的策划、设计、摄影摄像、服装搭配、化妆及品牌视觉顾问,形成了一支独一无二…

在 .NET 项目中使用 husky 完成 pre-commit 操作

将 husky 引入 .NET 项目Husky 是一个用于 Git 仓库的工具,主要用于管理 Git 钩子(hooks)。它可以帮助开发者在特定的 Git 操作(如提交、推送等)之前或之后执行自定义的脚本或命令,从而提高代码质量和团队协作效率。 主要用在前端项目中,可以通过 Husky.Net,将 Husky 的…

贸易企业数字化转型案例:基于日事清的目标管理、任务协作与流程可视化绩效优化实践

这家贸易公司如何提升内部协同效率?一、基本情况 所属行业:传统贸易行业 业务类型:国内贸易、货物及技术进出口 行业地位:拥有自己的研发人员,具备一站式解决方案能力。 合作概要:为解决组织提效,目标体系、协同体系、绩效体系的管理问题,客户与日事清达成合作,并将日…

使用nvm管理node.js版本

1.情景展示如上图所示,项目某个模块支持的node.js最高版本是17,我用的是20,所以只能降级。 2.具体分析 我现在把node.js降到16,那后续如果再需要20呢?能不能实现版本的随时切换? 3.安装nvm 我们可以使用nvm来管理node.js的版本。 下载nvm windows下载地址:https://githu…

3.19 学习记录

完成了仓库管理系统的制作,基本无bug,所展示功能都可以实现,基于 springboot 和 vue3 具体实现如下: 登录管理员页面 有仓库管理,物资管理,库存管理和统计功能仓库工作人员页面

网站测速——提升用户体验的关键

在互联网飞速发展的今天,网站已成为企业展示形象、提供服务以及用户获取信息的重要平台。而网站的速度,如同高速公路的路况,直接影响着用户的访问体验和满意度。因此,网站测速成为了网站运营和维护中不可或缺的关键环节。 网站速度对企业来说真的那么重要吗?​ 网站测速的…

表单和载荷的区别,以及python和js在处理json时的空格问题。

1、在 传载荷的时候,用json= 这样传底层会调用json.dumps来转换,如:response = requests.post(url,headers=headers,params=params,data=json.dumps(data.separators=(,":")) 2、在 传表单的时候,用data= 如:response = requests.post(url,headers=headers,…