用 Go 实现验证码识别服务

一、项目介绍
本文介绍如何使用 Go 语言开发一个简易的验证码识别系统。该系统可加载本地验证码图像文件,对其进行图像预处理、字符切割,然后利用 ONNX 格式的神经网络模型进行字符识别,最终输出完整的验证码字符串。

二、技术栈
语言:Go 1.20+

图像处理:标准库 image + imaging
更多内容访问ttocr.com或联系1436423940
模型推理:onnxruntime-go

模型训练:建议使用 Python 训练并导出为 ONNX 格式

模型类型:LeNet-5、ResNet、或者自定义 CNN 模型

三、核心流程说明

  1. 图像加载与字符分割
    验证码一般由固定数量(如4位)字符组成,图像分割策略为定宽裁剪。

func SplitCaptcha(img image.Image, count int) []image.Image {
width := img.Bounds().Dx()
height := img.Bounds().Dy()
step := width / count

var segments []image.Image
for i := 0; i < count; i++ {
	rect := image.Rect(i*step, 0, (i+1)*step, height)
	segment := imaging.Crop(img, rect)
	resized := imaging.Resize(segment, 28, 28, imaging.Lanczos)
	segments = append(segments, resized)
}
return segments

}
2. 灰度转换与张量生成

func ImageToTensor(img image.Image) []float32 {
data := make([]float32, 2828)
for y := 0; y < 28; y++ {
for x := 0; x < 28; x++ {
r, g, b, _ := img.At(x, y).RGBA()
gray := float32(0.3
float64(r>>8) + 0.59float64(g>>8) + 0.11float64(b>>8)) / 255.0
data[y*28+x] = gray
}
}
return data
}
3. 模型加载与识别逻辑

func PredictChar(session onnxruntime.Session, tensor []float32) string {
input, _ := onnxruntime.NewTensor([]int64{1, 1, 28, 28}, tensor)
result, _ := session.Run(map[string]
onnxruntime.Tensor{"input": input})
prob := result[0].Float32Data()

maxIdx := 0
for i, v := range prob {
	if v > prob[maxIdx] {
		maxIdx = i
	}
}
return string("0123456789abcdefghijklmnopqrstuvwxyz"[maxIdx])

}
4. 主程序逻辑

func main() {
img, _ := imaging.Open("captcha.png")
chars := SplitCaptcha(img, 4)

session := LoadModel("model.onnx")
var result string
for _, char := range chars {
	tensor := ImageToTensor(char)
	result += PredictChar(session, tensor)
}

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

}
四、示例输出
输入图像:captcha.png
输出识别:a4dk

posted @ 2025-06-04 13:48  ttocr、com  阅读(16)  评论(0)    收藏  举报