使用 Go 实现简易图像验证码识别系统

一、简介
图像验证码是一种常见的安全机制,本文介绍如何使用 Go 语言构建一个识别简单字符型图像验证码的程序。核心包括图像预处理、字符切割、灰度处理,以及调用预训练的 ONNX 模型进行识别。

二、技术选型
语言:Go 1.20+

图像处理库:github.com/disintegration/imaging

推理引擎:github.com/rai-project/onnxruntime-go

模型:Python 训练导出的 CNN(ONNX 格式)
更多内容访问ttocr.com或联系1436423940
三、系统结构
图像加载与处理

字符切割与归一化

张量转换

模型加载与识别

组合输出

四、关键代码片段

加载验证码图像
img, err := imaging.Open("test_captcha.png")
if err != nil {
log.Fatalf("无法加载图像: %v", err)
}
2. 分割字符(假设验证码为4位)

func Split(img image.Image, count int) []image.Image {
w := img.Bounds().Dx()
h := img.Bounds().Dy()
step := w / count

var result []image.Image
for i := 0; i < count; i++ {
part := imaging.Crop(img, image.Rect(istep, 0, (i+1)step, h))
part = imaging.Resize(part, 28, 28, imaging.Lanczos)
result = append(result, part)
}
return result
}
3. 转换为张量输入

func ToTensor(img image.Image) []float32 {
var data []float32
for y := 0; y < 28; y++ {
for x := 0; x < 28; x++ {
r, g, b, _ := img.At(x, y).RGBA()
gray := float32((r30 + g59 + b*11) / 100 >> 8)
data = append(data, gray/255.0)
}
}
return data
}
4. 加载 ONNX 模型并识别

func PredictChar(session onnx.Session, input []float32) string {
tensor, _ := onnx.NewTensor([]int64{1, 1, 28, 28}, input)
output, _ := session.Run(map[string]onnx.Tensor{"input": tensor})
probs := output[0].Float32Data()
idx := 0
for i := range probs {
if probs[i] > probs[idx] {
idx = i
}
}
return string("0123456789abcdefghijklmnopqrstuvwxyz"[idx])
}
5. 主函数整合识别流程

func main() {
img, _ := imaging.Open("test_captcha.png")
chars := Split(img, 4)
session := LoadModel("captcha_model.onnx")

var result string
for _, ch := range chars {
tensor := ToTensor(ch)
result += PredictChar(session, tensor)
}
fmt.Println("识别结果:", result)
}
五、模型准备说明
使用 Python 训练一个简单 CNN 模型(如 LeNet)后,将其导出为 .onnx 格式,便可直接调用。

posted @ 2025-07-02 21:25  ttocr、com  阅读(14)  评论(0)    收藏  举报