用 Swift 和 Tesseract OCR 实现验证码识别

news/2025/9/25 22:06:34/文章来源:https://www.cnblogs.com/ocr12/p/19112160

一、背景介绍

Swift 是 Apple 推出的现代化编程语言,广泛应用于 iOS 和 macOS 应用开发。结合 Tesseract OCR,可以在移动和桌面应用中高效地识别验证码。本文将展示如何使用 Swift 结合 Tesseract OCR 实现验证码自动识别。

二、环境准备
2.1 安装 Homebrew(macOS)
更多内容访问ttocr.com或联系1436423940
如果尚未安装 Homebrew,可以使用以下命令安装:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2.2 安装 Tesseract OCR

通过 Homebrew 安装 Tesseract:

brew install tesseract

2.3 Swift Package Manager 添加依赖

编辑项目的 Package.swift 文件:

// swift-tools-version:5.7
import PackageDescription

let package = Package(
name: "CaptchaOCR",
platforms: [
.macOS(.v12)
],
dependencies: [
.package(url: "https://github.com/SwiftyTesseract/SwiftyTesseract.git", from: "2.0.0")
],
targets: [
.executableTarget(
name: "CaptchaOCR",
dependencies: ["SwiftyTesseract"]
)
]
)

三、代码实现
3.1 创建 Swift 文件

在项目根目录下创建 Sources/CaptchaOCR/main.swift:

import Foundation
import SwiftyTesseract
import AppKit

func preprocessImage(imagePath: String) -> NSImage? {
guard let image = NSImage(contentsOfFile: imagePath) else {
print("无法加载图像")
return nil
}

// 灰度化
let grayscale = NSImage(size: image.size)
grayscale.lockFocus()
image.draw(in: NSRect(origin: .zero, size: image.size),from: NSRect(origin: .zero, size: image.size),operation: .sourceOver,fraction: 1.0)
grayscale.unlockFocus()// 保存灰度图像(可选)
let outputPath = "processed_captcha.png"
let bitmapRep = NSBitmapImageRep(data: grayscale.tiffRepresentation!)
let pngData = bitmapRep?.representation(using: .png, properties: [:])
try? pngData?.write(to: URL(fileURLWithPath: outputPath))return grayscale

}

func recognizeCaptcha(imagePath: String) {
let tesseract = SwiftyTesseract(language: .english)

guard let preprocessedImage = preprocessImage(imagePath: imagePath) else {print("图像预处理失败")return
}tesseract.performOCR(on: preprocessedImage) { result inswitch result {case .success(let text):print("识别出的验证码: \(text.trimmingCharacters(in: .whitespacesAndNewlines))")case .failure(let error):print("OCR 识别失败: \(error)")}
}

}

let imagePath = "captcha.png"
recognizeCaptcha(imagePath: imagePath)

四、运行程序
4.1 运行 Swift 项目

在项目根目录运行以下命令:

swift run

4.2 运行效果

程序将识别图像中的验证码并输出:

识别出的验证码: A8K3D

五、识别优化
5.1 设置字符白名单

Tesseract 可以配置仅识别字母和数字:

tesseract.setVariable(.tesseditCharWhitelist, value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")

5.2 使用特定页面分割模式(PSM)
tesseract.setVariable(.pageSegmentationMode, value: "6")

六、应用场景

iOS 自动化测试:
使用 Swift 和 Tesseract 实现验证码自动填充,加快测试流程。

macOS 工具开发:
构建一个批量识别验证码的桌面应用,支持拖放图片识别。

文本提取和数据分析:
自动化提取图像中的数字或字母信息,提升数据录入效率。

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

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

相关文章

Rust 和 Tesseract OCR 实现验证码识别

一、背景介绍 Rust 以其高性能和内存安全著称,适合构建高效的图像处理和 OCR 应用程序。本文将结合 Tesseract OCR,使用 Rust 实现验证码识别。 二、环境准备 2.1 安装 Rust 更多内容访问ttocr.com或联系1436423940 …

AI-Powered-ToDo-List

AI-Powered-ToDo-List https://github.com/fanqingsong/AI-Powered-ToDo-ListAI 智能任务管理器基于 LangGraph 和 React 的智能任务管理应用,支持传统手动管理和 AI 对话式管理两种方式。✨ 功能特性🎯 双重管理方…

Netty:完成RPC服务(实战)

Netty:完成RPC服务(实战)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

Python 在 Web 开发中的应用与趋势

一、引言 🌐 随着互联网的普及和应用场景的不断拓展,Web 开发已经成为软件工程的核心组成部分。从简单的静态网页到复杂的交互式应用,Web 技术在近二十年间经历了飞速发展。而 Python,作为一门简洁优雅、功能强大…

网页设计怎么建站点店铺管理软件

📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 定义 消息队列:一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件,很多初学者认为,MQ通过消息的发送…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档) - 实践

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

LLM MOE的进化之路

1. 阅读前提 本次课一共讲解三个不同版本的 MOE,分别是基础版MOE,大模型训练用的 SparseMoE,还有 DeepSeek 用的比较多的 shared_expert 的 SparseMoE。 2. 版本1:基础版本MOE 输入是一个 Token, 输出是一个 Token…

相交链表-leetcode

题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。 …

【pytorch】关于深度学习模型是怎么使数据从头流动到尾的

【pytorch】关于深度学习模型是怎么使数据从头流动到尾的Posted on 2025-09-25 21:52 SaTsuki26681534 阅读(0) 评论(0) 收藏 举报问题描述 之前在看cycleGAN的代码时想到一个问题 代码里用类的方式定义cycleGAN模…

AtCoder ARC114 总结 (A-C)

AtCoder ARC114 总结 A 50 内只有 15 个质数。\(2^{15}\) 枚举所有情况然后 \(O(n)\) check 即可。 B 若 \(i\to f(i)\) 连边,原题意相当于选出若干个环。答案即 \(2^{\text {环数}}-1\)。 C 考虑一开始每个数都有 \(…

松江郑州阳网站建设郑州专业网站设计

运维 | 使用 Docker 安装 Jenkins | Jenkins 前言 本期内容主要是为了学习如何通过 Docker 安装Jenkins,仅作为记录与参考,希望对大家有所帮助。 准备工作 系统:CentOS 7.9配置:4c8g 快速安装 下面以 Docker 方式安装 Jenkin…

告别单张保存!PPT 图片无损批量提取,这 3 种方法亲测有效!

告别单张保存!PPT 图片无损批量提取,这 3 种方法亲测有效! 谁懂啊!做 PPT 设计或者经常处理 PPT 的人,肯定遇到过这种崩溃场景:手里有个几百页的 PPT,每一页都插了好几张配图,要把这些图都弄出来用,只能一张张…

SQL Server从入门到项目实践(超值版)读书笔记 26 - 实践

SQL Server从入门到项目实践(超值版)读书笔记 26 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

?模拟赛(2) 赛后总结

和昨天一样的 CCDD 。 如果说昨天的三个小时很充实的话,那今天的三个小时可以说是相当空虚了,因为什么也不会。 题目在这里!A 鲁的要塞去年做过,比今年还高 30 ,我真的要回去上 whk 了。 指挥中心的坐标一定是取 …

日总结 8

今天有个天大的好消息,我姐姐考上中科院研究生了,家里人都非常高兴,我也是,但我也意识到我也大三了,却还是对自己的前途迷茫,我不知道是不是应该考研,我也清楚的知道没有个厉害的技术本科毕业找不到什么好工作,…

【C语言】C语言预处理详解,从基础到进阶的全面讲解 - 指南

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

深圳做微信网站公司商城网站建设系统

PHP与视频播放插件功能实现,非常简单龙行 PHP 2018-8-28 2579 0评论最近在研究maccms所以会接触到这个ckplayer播放器,那么如何php与视频播放器插件的功能,说白了就是前端是播放器的插件,直接调用后端传递过来的播放地…

制作微信公众号的网站开发wordpress start

来源: 腾讯科技 概要:近日发表的一份权威研究报告指出,全球厂商已经在自动驾驶领域投资 800 亿美元,但是迄今为止,仍然没有一家明显处于领先优势的厂商。 自动驾驶和电动车成为当下科技行业两大热点之一,几…

成都中小企业网站建设公司品牌推广公司排行榜

1. TinyMCE 官方网站地址(可能需要魔法上网才能访问) 我们直接找到 TinyMCE 关于 vue 的下载地址,其他框架的下载也在这里 2. 向下找,找到关于vue3下载的地方 下载命令 npm install --save "tinymce/tinymce-vue^5" 例…

完整教程:讲一下ZooKeeper的持久化机制

完整教程:讲一下ZooKeeper的持久化机制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…