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


一、引言
在自动化测试和数据处理任务中,验证码识别是一项具有挑战性的任务。Kotlin 作为现代化的 JVM 语言,能够很好地与 Tesseract OCR 结合,快速完成验证码识别。
本文将演示如何使用 Kotlin 结合 Tesseract OCR 进行验证码识别,并进行图像预处理以提高识别率。

二、环境准备
2.1 安装 Kotlin
首先,确保本地安装了 Kotlin:

sdk install kotlin
kotlin -version
2.2 安装 Tesseract OCR
Linux (Ubuntu):

sudo apt update
sudo apt install tesseract-ocr libtesseract-dev
Windows:

下载 Tesseract Windows 版本。

配置环境变量。

macOS:


brew install tesseract
三、创建 Kotlin 项目
使用 Gradle 创建一个 Kotlin 项目:


mkdir captcha_ocr_kotlin
cd captcha_ocr_kotlin
gradle init --type application
3.1 配置 Gradle
编辑 build.gradle.kts 文件,添加依赖:
更多内容访问ttocr.com或联系1436423940
plugins {
    kotlin("jvm") version "1.9.0"
    application
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("net.sourceforge.tess4j:tess4j:5.7.0")
}

application {
    mainClass.set("MainKt")
}
四、Kotlin 代码实现
4.1 代码结构
加载验证码图像

图像预处理(灰度化、二值化)

使用 Tesseract 识别验证码

打印识别结果

4.2 代码示例
编辑 src/main/kotlin/Main.kt 文件:

import net.sourceforge.tess4j.Tesseract
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO

fun preprocessImage(imagePath: String): BufferedImage {
    val image = ImageIO.read(File(imagePath))
    val grayImage = BufferedImage(image.width, image.height, BufferedImage.TYPE_BYTE_GRAY)

    for (y in 0 until image.height) {
        for (x in 0 until image.width) {
            val rgb = image.getRGB(x, y)
            val r = (rgb shr 16) and 0xff
            val g = (rgb shr 8) and 0xff
            val b = rgb and 0xff
            val gray = (0.299 * r + 0.587 * g + 0.114 * b).toInt()
            val newPixel = (gray shl 16) or (gray shl 8) or gray
            grayImage.setRGB(x, y, newPixel)
        }
    }

    val outputPath = "processed_captcha.png"
    ImageIO.write(grayImage, "png", File(outputPath))
    return grayImage
}

fun recognizeCaptcha(imagePath: String): String {
    preprocessImage(imagePath)

    val tesseract = Tesseract()
    tesseract.setDatapath("/usr/share/tesseract-ocr/4.00/tessdata")
    tesseract.setLanguage("eng")
    tesseract.setPageSegMode(6)  // 假设为单行文本

    return try {
        val text = tesseract.doOCR(File("processed_captcha.png"))
        text.trim()
    } catch (e: Exception) {
        "识别失败: ${e.message}"
    }
}

fun main() {
    val captchaPath = "captcha.png"  // 替换为你的验证码图片路径
    val result = recognizeCaptcha(captchaPath)
    println("识别出的验证码: $result")
}
五、运行程序
构建并运行程序:

./gradlew run
六、优化识别率
6.1 更改 PSM 模式
Tesseract 支持不同的页面分割模式 (PSM),可以根据验证码特性调整:

tesseract.setPageSegMode(7)  // 设为单个文本行
6.2 使用特定训练数据
如果验证码主要是数字或特定字符,可以指定语言为 eng+osd:


tesseract.setLanguage("eng+osd")
6.3 进一步图像优化
噪声去除:利用形态学操作去除干扰线。

字符放大:放大图像有助于提升 Tesseract 的识别率。