用 Go 实现多字符图像验证码识别系统

本项目演示如何通过 Go 语言实现一个多字符验证码图像识别工具,结合图像处理和 ONNX 模型推理技术,自动识别出验证码中的多个字符。
更多内容访问ttocr.com或联系1436423940
一、项目概述
目标是识别形如 a2C9 的四位字符验证码。验证码背景简单,字符无旋转、无干扰线,便于分割与识别。

输入:验证码图片(如 a2C9.png)

输出:识别结果字符串(如 a2C9)

使用工具:

gocv:用于图像读取与分割

onnxruntime-go:用于加载和运行预训练 ONNX 模型

二、字符分割策略
我们假设验证码图片宽高固定为 100x40,其中包含 4 个等宽字符,使用简单切割即可分割出单字符图片:

func splitCharacters(img gocv.Mat) []gocv.Mat {
var chars []gocv.Mat
width := img.Cols()
step := width / 4
for i := 0; i < 4; i++ {
crop := img.Region(image.Rect(istep, 0, (i+1)step, img.Rows()))
resized := gocv.NewMat()
gocv.Resize(crop, &resized, image.Pt(28, 28), 0, 0, gocv.InterpolationLinear)
chars = append(chars, resized.Clone())
crop.Close()
resized.Close()
}
return chars
}
三、推理函数(单字符)
假设我们有一个字符识别模型 char_model.onnx,可以识别 36 类(0-9 + a-z):

func predictChar(data []float32, session onnxruntime.Session) (string, error) {
tensor, err := onnxruntime.NewTensor([]int64{1, 1, 28, 28}, data)
if err != nil {
return "", err
}
outputs, err := session.Run(map[string]
onnxruntime.Tensor{"input": tensor})
if err != nil {
return "", err
}
labels := "0123456789abcdefghijklmnopqrstuvwxyz"
maxIdx := 0
scores := outputs[0].Float32Data()
for i, score := range scores {
if score > scores[maxIdx] {
maxIdx = i
}
}
return string(labels[maxIdx]), nil
}
四、主程序

func preprocessChar(mat gocv.Mat) []float32 {
data := make([]float32, 2828)
for y := 0; y < 28; y++ {
for x := 0; x < 28; x++ {
data[y
28+x] = float32(mat.GetUCharAt(y, x)) / 255.0
}
}
return data
}

func main() {
img := gocv.IMRead("captcha.png", gocv.IMReadGrayScale)
if img.Empty() {
log.Fatal("图片读取失败")
}
defer img.Close()

// 加载模型
env, _ := onnxruntime.NewEnvironment()
session, _ := env.NewSession("char_model.onnx")
defer session.Close()

chars := splitCharacters(img)
var result string
for _, ch := range chars {
	data := preprocessChar(ch)
	pred, _ := predictChar(data, session)
	result += pred
	ch.Close()
}
fmt.Printf("验证码识别结果:%s\n", result)

}
五、效果演示
输入图片:captcha.png
内容示例:a2b7

程序输出:

验证码识别结果:a2b7

posted @ 2025-06-03 19:17  ttocr、com  阅读(15)  评论(0)    收藏  举报