使用 Kotlin 结合 Tesseract OCR 识别验证码

news/2025/10/31 23:09:03/文章来源:https://www.cnblogs.com/ocr12/p/19181429

更多内容访问ttocr.com或联系1436423940

  1. 环境准备
    1.1 安装 Kotlin

如果尚未安装 Kotlin,可以通过 Kotlin 官方网站
下载,或者使用 SDKMAN 安装:

sdk install kotlin

检查安装是否成功:

kotlin -version

1.2 安装 Tesseract OCR
Windows

从 Tesseract GitHub
下载并安装。

Linux(Ubuntu)
sudo apt install tesseract-ocr

macOS(Homebrew)
brew install tesseract

安装完成后,检查是否成功安装:

tesseract --version

1.3 创建 Kotlin 项目

使用 Gradle 创建 Kotlin 项目:

mkdir captcha_reader
cd captcha_reader
gradle init --type basic

然后,在 build.gradle.kts 添加 Tesseract 依赖:

dependencies {
implementation("com.rmtheis:tess-two:9.1.0") // Android 使用
}

  1. 代码实现

在 src/main/kotlin/Main.kt 文件中写入以下代码:

import java.io.File
import net.sourceforge.tess4j.Tesseract
import net.sourceforge.tess4j.TesseractException

fun main() {
val imagePath = "captcha.png" // 替换为你的验证码图片路径
val tesseract = Tesseract()

// 设置 Tesseract 语言和数据路径
tesseract.setDatapath("/usr/share/tesseract-ocr/4.00/tessdata") // 修改为你的 Tesseract 训练数据路径
tesseract.setLanguage("eng")try {val result = tesseract.doOCR(File(imagePath))println("识别出的验证码: $result")
} catch (e: TesseractException) {println("OCR 识别失败: ${e.message}")
}

}

  1. 代码解析
    3.1 读取图片并调用 Tesseract
    val tesseract = Tesseract()
    tesseract.setDatapath("/usr/share/tesseract-ocr/4.00/tessdata")
    tesseract.setLanguage("eng")

setDatapath 指定 Tesseract 数据文件路径

setLanguage("eng") 设置 OCR 识别语言

3.2 进行 OCR 识别
val result = tesseract.doOCR(File(imagePath))

读取 captcha.png 并使用 Tesseract 进行 OCR 解析

  1. 运行程序

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

gradle run

示例输出:

识别出的验证码: X7G9H

  1. 提高 OCR 识别率
    5.1 使用不同的 Tesseract PSM 模式
    tesseract.setTessVariable("tessedit_pageseg_mode", "6")

--psm 6 适用于单行验证码,提高识别率

5.2 限制识别字符集
tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")

限制 Tesseract 只识别数字和大写字母

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

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

相关文章

使用 Swift 结合 Tesseract OCR 解析验证码

环境准备 1.1 安装 Swift如果使用 macOS,可以直接在 Xcode 中使用 Swift。检查 Swift 是否安装: swift --version 更多内容访问ttocr.com或联系1436423940 如果使用 Linux,可参考 Swift 官方网站 进行安装。 1.2 安…

自律这一块儿

随笔的话我随便写写吧 1️⃣关于批评 现在刷抖音或者其他的内容传播平台, 一方面总是在加重我的焦虑与不安 一方面也不断的让我感受到世界的参差 我总是看到很多傲慢的人,我有的时候真的很想批判这些表面温和但内里却…

(Mutual) correlated agreement

Correlated agreement 形式化定义:Mutual correlated agreement 形式化定义:区别: 前者没有规定折叠后的向量和码字一致的index集合与每个向量一致的index集合相同.作者:神龙小虾出处:https://www.cnblogs.com/yangm…

AI元人文随想:当内心黑箱遇见技术黑箱

AI元人文随想:当内心黑箱遇见技术黑箱 我们正置身于一场史无前例的对话实验: 人类捧着跳动的心脏走向机器 机器则报以精心编织的语言锦缎 两个黑箱的相遇,竟成就了这个时代最亲密的疏离 壹黑箱时代的对话悖论 每个人…

如何基于区块链底层技术逻辑,反向用于 差别 AI生成与非AI生成内容

把“区块链”反过来当成一把“刻刀”,在 AI 生成的数据里刻下“只有原生创作那一刻才能刻得出来”的伤痕;日后任何人拿到数据,只要发现伤痕对不上链上记录,就能判定它一定是 AI 二次生成。整套逻辑不是“存证”那么…

2025.10.31总结

今天继续软考的学习,今天刷了上午题一套半的题,正确率比较低。目前的问题挺多,对于见过的题型来说,没有将这个题型背后的知识点掌握。 导致后面遇到相似的题,但仍然做不对。面对庞大的知识体系,尤其是对于理论,…

fastgrind不过如此

fastgrind不过如此博客园的编辑推荐了《一个轻量级C++内存监控及可视化开源库》,下载试了试。 (一)作者忘记#include <array>,编译通不过。 (二)手动插桩 (instrument) 防不了段错误:/home/user/fastgrin…

电动车 NFC 学卡 All In One

电动车 NFC 学卡 All In One NFC 钥匙 / NFC 母卡 / NFC 子卡绿源电动车 ✅ / iPhone Apple 钱包 ✅ / 上海公共交通卡 ✅电动车 NFC 学卡 All In OneNFC 钥匙 / NFC 母卡 / NFC 子卡demos绿源电动车 ✅ / iPhone Ap…

如何设计一个秒杀系统

一:前言 1.在双十一或618期间电商平台会出一些秒杀活动来增加用户活跃带动其余商品销量。2.秒杀系统面临三个问题:数据一致性、服务高性能、服务高可用。3.针对一致性、高性能、高可用的思考1)在高并发的情况下库存…

基于Qlearning强化学习的电梯群控系统高效调度策略matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):2.算法涉及理论知识概要 随着高层建筑的不断增多,电梯成为人们日常生活中不可或缺的垂直交通工具。电梯群控系统(Elevator Group Control System,…

基于Qlearning强化学习的Cart-Pole推车杆平衡控制系统matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):通过不断与环境交互并更新Q值函数,智能体能够逐渐学习到在不同状态下的最优动作,从而实现杆的平衡控制。 仿真操作步骤可参考程序配套的操作视频。…

绿源电动车 NFC 学卡 All In One

绿源电动车 NFC 学卡 All In One NFC 钥匙 / NFC 母卡 / NFC 子卡 Apple 钱包,iPhone 上海公共交通卡 ✅绿源电动车 NFC 学卡 All In OneNFC 钥匙 / NFC 母卡 / NFC 子卡demosApple 钱包,iPhone 上海公共交通卡 ✅…

洛谷 P8867 建造军营

传送门。 边双直接缩掉,成为一棵树。下面的【结点】都是指缩之后的。 于是可以定义一个 \(a_u\) 为,\(u\) 点内有军营的方案数,\(b_u\) 为无。 总方案数就对应着,树上每种方案的权值和。 首先考虑一个 DP,设 \(f_…

代码大全2阅读感悟2

读国《代码大全 2》后,最深刻的感悟是 “细节成就卓越”。书中对变量命名、注释撰写、循环优化等细节的剖析,打破了我 “功能实现即可” 的片面认知。一个模糊的变量名、一段缺失的注释,都可能成为后期调试的 “拦路…

代码大全2阅读感悟3

《代码大全 2》让我跳出 “埋头写代码” 的局限,理解了编程的系统性。书中将需求分析、架构设计、编码实现、测试优化视为有机整体,强调每个环节的关联性。原来,脱离整体规划的编码,再精妙也可能偏离目标。这启示我…

【Python】某站音视频爬取(转载)

import pprint import requests import re import jsonsession = requests.session() url = 你需要爬取的音视频网址 headers = {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …

代码大全2阅读感悟

《代码大全 2》让我明白,编程规则从不是自由的枷锁。书中对代码规范、命名原则的细致讲解,揭示了 “有序” 背后的高效逻辑。遵循统一标准的代码,不仅能降低协作成本,更能减少后期维护的麻烦。这让我意识到,真正的…

RT-Thread之消息队列使用示例

消息队列(Message Queue)是一种异步通信机制,本教程介绍其API接口及使用示例。消息队列(Message Queue)是一种异步通信机制,其核心功能是:解耦生产者和消费者:发送方和接收方无需同时在线 缓冲与流量整形:应对…

STM32之GPIO输出

在 STM32 的开发中,GPIO(通用输入/输出)是一种极其重要且常用的外设资源。无论是用于控制 LED、按键、电机驱动,还是与其他外设之间通信,GPIO 都是实现这些功能的核心接口。在 STM32 的开发中,GPIO(通用输入/输…

神秘数据结构手法之区间 LIS

给定 \(1\sim n\) 的排列,\(q\) 次询问,每次查询区间 \([l,r]\) 内的最长上升子序列长度。 \(n \leq 10^5\)。这里只讨论排列的情况,如果不是排列,也容易通过重新编号变成在 LIS 上等价的一排列。 \(O(n\sqrt{n}\ …