使用 Swift 和 Tesseract OCR 解析验证码

news/2025/3/20 16:12:22/文章来源:https://www.cnblogs.com/ocr12/p/18783300
  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 = processedImagetess.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)

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

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

相关文章

KUKA库卡KR360_R2830机械臂维修减速机卡住了

库卡机器人维修减速机卡死,作为一种常见的机械故障,其成因往往复杂多样,通常可以归结为长时间的高强度工作、外部异物的侵入、安装过程中的疏忽以及润滑系统的失效等多种因素。以下是对这一故障常见原因的详尽阐述,以及一些实用的维修建议:库卡机器人减速机卡死现象的根源…

【原厂】点阵LED数码管驱动/内置显示RAM为8x16位-LED显示驱动芯片VK1640 SOP28

产品品牌:永嘉微电/VINKA 产品型号:VK1640 封装形式:SOP28 概述 VK1640是一种数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、LED 驱 动等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx16GRID的点阵LED显示。 适用于小型LED显示屏驱动。采用SOP28的封装形式…

portainer学习笔记1

Portainer是一款非常好用的docker容器管理平台,部署也很easy。# 创建portainer数据卷 docker volume create portainer_data # 拉取镜像启动portainer docker run -d -p 8000:8000 -p 9443:9443 \ --name portainer --restart=always \ -v /var/run/docker.sock:/var/run/dock…

安装Python保姆级教程(Pycharm破解码+解释器安装)

一、进入Python官网首页,下载最新的Python版本 https://www.python.org/downloads/ 选择最新的Python3.10.5,下载64位的版本 二、下载完成后,进行安装 1.双击Python-3.10.5-amd64.exe 3.出现此页面表示安装成功 三、运行Python 1.Win+R打开控制台,输入Python 此时出现了一…

dify知识库

一、概述 知识库功能将 RAG 管线上的各环节可视化,提供了一套简单易用的用户界面来方便应用构建者管理个人或者团队的知识库,并能够快速集成至 AI 应用中。 开发者可以将企业内部文档、FAQ、规范信息等内容上传至知识库进行结构化处理,供后续 LLM 查询。 相比于 AI 大模型内…

DevOps 平台选型对比:功能与价值剖析

在数字化转型加速的当下,高效的软件开发流程成为企业竞争力的关键。DevOps 平台作为整合开发与运维的重要工具,其选型至关重要。Gitee DevOps 是一款在行业内表现出色的平台,能为企业提供从代码管理到部署上线的全流程支持。通过对其功能、价格、用户体验等多方面与市场竞品…

关于如何搭建anythingllm+ollama(deepseekr1、嵌入模型)+milvus的本地知识库语言模型

这里只是对于自己在部署过程中踩到的坑做个记录。 以anythingllm为平台,接入基于ollama运行deepseekr1通用模型、嵌入模型,使用milvus作为向量数据库。其中milvus和anythingllm均在docker desktop中运行。 一、ollama 1.首先在ollama官网下载并安装ollama。 2.然后在官网的mo…

Endnote 修改了参考文献格式后,文献的引用有的上标,有的不是上标

如上图,有的文献引用是正常格式,有的文献引用的的方括号是上标的形式。解决如下: 打开Endnote,找到“编辑”---“输出样式”---“编辑XXXXXX”(XXXXXX表示你正在使用的参考文献格式)---“引用”---“模板”---“Citatian” 将方框中的“Bibliography Number”两边的方括号…

Explain查询Sql效率

Explain分析Sql性能 前言 在我们平时开发中,因为系统可能属于初级阶段,数据库的数据还不是很多,所以自我感觉写的Sql语句上运行起来速度还不错,殊不知,随着时间推移,数据量日益增多,系统的查询效率会在打折扣,所以,Sql性能调优手段还得了解一下下。 Explain是什么?有…

部署mall项目遇到的问题和解决方案

部署mall项目爬坑日记 原作者项目 环境:ubuntu20 docker容器相关的坑 发现容器打印的日志和当前时间有出入,相差了8小时,后面得知容器和宿主机的时区不同导致 !> 解决办法有如下几种:1.在刚开始创建容器的时候,docker run后面加上-v /etc/localtime:/etc/localtime:ro2…

高并发下如何保证幂等性

好文章怕丢失?码起来! 本文转载自原文 高并发下如何保证接口的幂等性? 接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场…

考OCP认证要交哪些费用?

考OCP认证要交哪些费用? 考OCP认证,指的是Oracle数据库管理员中级认证 Oracle Certified Professional,这是Oracle非常有名的一个认证,对于个人帮助巨大。 OCP认证要交不少钱,些费用因考试版本、培训机构和地区差异而有所不同,以下是综合各渠道信息后的费用说明: 1. 考…