用 Go 和 Tesseract 实现验证码识别


一、引言
验证码识别在自动化操作和爬虫领域有着重要作用,Go 语言以其高效和简洁而广受欢迎。通过结合 Tesseract OCR,我们可以在 Go 中快速实现验证码识别。本文将介绍如何用 Go 和 Tesseract 进行验证码识别。

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

go version
2.2 安装 Tesseract OCR
Linux (Ubuntu):

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

下载 Tesseract Windows 版本。

配置环境变量。

macOS:


brew install tesseract
三、创建 Go 项目
创建一个新的 Go 项目:


mkdir captcha_ocr
cd captcha_ocr
go mod init captcha_ocr
安装 Tesseract 绑定:

go get github.com/otiai10/gosseract/v2
四、代码实现
4.1 代码结构
加载验证码图像

图像预处理(可选)

使用 Tesseract 进行验证码识别

打印识别结果

4.2 代码示例
创建 main.go 文件,写入以下代码:


package main

import (
    "fmt"
    "log"
    "github.com/otiai10/gosseract/v2"
)

func recognizeCaptcha(imagePath string) string {
    client := gosseract.NewClient()
    defer client.Close()

    // 设置验证码图片路径
    client.SetImage(imagePath)

    // 设置语言为英文
    client.SetLanguage("eng")

    text, err := client.Text()
    if err != nil {
        log.Fatalf("识别失败: %v", err)
    }

    return text
}

func main() {
    captchaPath := "captcha.png"  // 替换为验证码图片路径
    result := recognizeCaptcha(captchaPath)
    fmt.Printf("识别出的验证码: %s\n", result)
}
五、运行程序
构建和运行程序:


go run main.go
六、优化识别率
6.1 字符白名单
设置白名单可以提升识别效率:


client.SetWhitelist("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
6.2 更改页面分割模式
Tesseract 支持多种页面分割模式 (PSM):


client.SetPageSegMode(gosseract.PSM_SINGLE_LINE)
6.3 图像预处理
可以使用 OpenCV 或 ImageMagick 进行图像二值化和去噪,生成更清晰的验证码图像。

预处理完成后再传递给 Tesseract,可以显著提升识别准确率。

七、示例输出
假设验证码图像内容为 "AB123":


识别出的验证码: AB123