用 Go 实现图像验证码识别(命令行工具,轻量版)

项目介绍
本项目实现一个基于命令行的图像验证码识别工具,利用 TensorFlow Lite 模型进行推理,自动识别验证码字符。

项目结构
更多内容访问ttocr.com或联系1436423940
captcha-recognizer/
├── cmd/
│ └── main.go
├── internal/
│ ├── imageproc.go
│ └── recognizer.go
├── model/
│ └── captcha.tflite
├── go.mod
环境依赖

go mod init captcha-recognizer
go get github.com/mattn/go-tflite
go get github.com/nfnt/resize
imageproc.go(图像加载和预处理)

package internal

import (
"image"
"image/jpeg"
"image/png"
"os"
"strings"

"github.com/nfnt/resize"

)

func LoadImageAsFloat32(path string, width, height int) ([]float32, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()

var img image.Image
if strings.HasSuffix(path, ".png") {
	img, err = png.Decode(file)
} else {
	img, err = jpeg.Decode(file)
}
if err != nil {
	return nil, err
}

resized := resize.Resize(uint(width), uint(height), img, resize.Lanczos3)

var data []float32
for y := 0; y < height; y++ {
	for x := 0; x < width; x++ {
		r, g, b, _ := resized.At(x, y).RGBA()
		data = append(data,
			float32(r>>8)/255.0,
			float32(g>>8)/255.0,
			float32(b>>8)/255.0,
		)
	}
}
return data, nil

}
recognizer.go(识别模块)

package internal

import (
"fmt"

"github.com/mattn/go-tflite"

)

var charset = []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")

func argmax(data []float32) int {
maxIdx := 0
for i, val := range data {
if val > data[maxIdx] {
maxIdx = i
}
}
return maxIdx
}

func Predict(imagePath string) (string, error) {
model := tflite.NewModelFromFile("model/captcha.tflite")
if model == nil {
return "", fmt.Errorf("模型加载失败")
}
defer model.Delete()

interpreter := tflite.NewInterpreter(model, nil)
defer interpreter.Delete()

if err := interpreter.AllocateTensors(); err != nil {
	return "", err
}

inputData, err := LoadImageAsFloat32(imagePath, 160, 60)
if err != nil {
	return "", err
}

input := interpreter.GetInputTensor(0)
input.CopyFromBuffer(inputData)

if err := interpreter.Invoke(); err != nil {
	return "", err
}

result := ""
for i := 0; i < 4; i++ {
	output := interpreter.GetOutputTensor(i)
	buf := make([]float32, len(charset))
	output.CopyToBuffer(&buf[0])
	index := argmax(buf)
	result += string(charset[index])
}
return result, nil

}
main.go(程序入口)

package main

import (
"fmt"
"os"

"captcha-recognizer/internal"

)

func main() {
if len(os.Args) < 2 {
fmt.Println("用法:captcha-recognizer path/to/image.jpg")
return
}

imagePath := os.Args[1]
text, err := internal.Predict(imagePath)
if err != nil {
	fmt.Println("识别失败:", err)
	return
}

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

}
使用说明
编译项目:

go build -o captcha-recognizer ./cmd
运行:

./captcha-recognizer ./test/3K9L.png
输出示例:

识别结果:3K9L

posted @ 2025-06-01 12:07  ttocr、com  阅读(21)  评论(0)    收藏  举报