使用 Go 和 Tesseract 实现轻量级字符验证码识别工具

验证码(CAPTCHA)作为防止自动化访问的手段,在各类网站中广泛应用。传统的字符验证码通常包含简单干扰线条和扭曲字符,对于现代 OCR 技术而言已不再是难题。本文将介绍如何使用 Go 语言配合 Tesseract 实现一个轻量级字符验证码识别系统,强调模块分离、图像处理策略与部署便利性。

技术选型
Go(Golang):编译型语言,运行效率高,部署简洁,适合后端识别服务。

Tesseract OCR:开源光学字符识别引擎,支持多语言与字符集训练。
更多内容访问ttocr.com或联系1436423940
GoCV:Go 语言对 OpenCV 的封装,便于图像预处理。

gosseract:Go 的 Tesseract 客户端接口。

安装依赖
在使用之前,请确保系统中已安装 Tesseract:

sudo apt install tesseract-ocr
安装 GoCV 与 gosseract:

go get -u gocv.io/x/gocv
go get github.com/otiai10/gosseract/v2
核心逻辑概述
识别字符型验证码主要分为以下步骤:

加载图片

灰度化 + 二值化

去噪与轮廓提取

按字符分割

使用 OCR 引擎逐字符识别

合并输出字符串

代码实现
图像预处理与字符分割

// file: imageproc.go
package imageproc

import (
"gocv.io/x/gocv"
"image"
"sort"
)

func Preprocess(path string) (gocv.Mat, []image.Rectangle) {
img := gocv.IMRead(path, gocv.IMReadGrayScale)
gocv.Threshold(img, &img, 130, 255, gocv.ThresholdBinaryInv)

contours := gocv.FindContours(img, gocv.RetrievalExternal, gocv.ChainApproxSimple)
var rects []image.Rectangle

for _, c := range contours {
    rect := gocv.BoundingRect(c)
    if rect.Dx() > 5 && rect.Dy() > 10 {
        rects = append(rects, rect)
    }
}

sort.Slice(rects, func(i, j int) bool {
    return rects[i].Min.X < rects[j].Min.X
})

return img, rects

}
字符识别模块

// file: ocr.go
package ocr

import (
"fmt"
"os"
"gocv.io/x/gocv"
"github.com/otiai10/gosseract/v2"
)

func RecognizeChar(mat gocv.Mat, index int) string {
tempFile := fmt.Sprintf("temp_%d.png", index)
gocv.IMWrite(tempFile, mat)
defer os.Remove(tempFile)

client := gosseract.NewClient()
defer client.Close()
client.SetImage(tempFile)
client.SetWhitelist("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")

text, err := client.Text()
if err != nil {
    return ""
}
return text

}
主程序入口

// file: main.go
package main

import (
"fmt"
"log"
"yourproject/imageproc"
"yourproject/ocr"
)

func main() {
img, boxes := imageproc.Preprocess("captcha.png")
var result string

for i, box := range boxes {
    roi := img.Region(box)
    text := ocr.RecognizeChar(roi, i)
    result += text
}

fmt.Println("识别结果:", result)

}
效果测试
我们使用一张常见的 5 位字符验证码图片(如 7ACWQ.png),在清晰图像下的识别结果如下:

识别结果: 7ACWQ
识别准确率达到 90% 以上,特别是在字符未重叠的验证码中效果良好。

实用建议
去噪技巧:可以加入中值滤波、腐蚀膨胀操作提高字符分割精度。

字体训练:对于特殊字体验证码,可以通过 Tesseract 的训练工具生成自定义训练集。

错误容忍:识别结果可加入逻辑判断,如仅保留长度为 5 的字符串。

posted @ 2025-07-24 11:53  ttocr、com  阅读(27)  评论(0)    收藏  举报