使用 Go 实现简易图像验证码识别工具(结构清晰,便于扩展)

项目简介
本项目实现一个命令行工具,用于模拟图像验证码识别流程,后期可接入实际机器学习模型。

目录结构
更多内容访问ttocr.com或联系1436423940
captcha-cli/
├── main.go
├── imageutil/
│ └── preprocess.go
├── recognizer/
│ └── dummy.go
环境准备

go mod init captcha-cli
imageutil/preprocess.go
用于加载和预处理图片:

package imageutil

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

"github.com/nfnt/resize"

)

func LoadAndResize(path string, w, h int) (image.Image, 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(w), uint(h), img, resize.Lanczos3)
return resized, nil

}

func DumpImageInfo(img image.Image) {
bounds := img.Bounds()
fmt.Printf("图片尺寸:%dx%d\n", bounds.Dx(), bounds.Dy())
}
recognizer/dummy.go
一个模拟的验证码识别器:

package recognizer

import (
"fmt"
"math/rand"
"time"
)

var charset = []rune("ABCDEFGHJKLMNPQRSTUVWXYZ23456789")

func SimulateRecognize(length int) string {
rand.Seed(time.Now().UnixNano())
var result []rune
for i := 0; i < length; i++ {
result = append(result, charset[rand.Intn(len(charset))])
}
return string(result)
}

func RecognizeDummy(imagePath string) (string, error) {
fmt.Println("模拟识别中...")
time.Sleep(1 * time.Second)
code := SimulateRecognize(4)
return code, nil
}
main.go
命令行入口:

package main

import (
"captcha-cli/imageutil"
"captcha-cli/recognizer"
"fmt"
"os"
)

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

imagePath := os.Args[1]

img, err := imageutil.LoadAndResize(imagePath, 160, 60)
if err != nil {
	fmt.Println("图片加载失败:", err)
	return
}
imageutil.DumpImageInfo(img)

result, err := recognizer.RecognizeDummy(imagePath)
if err != nil {
	fmt.Println("识别失败:", err)
	return
}

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

}

go run main.go ./test/ABCD.png
输出:

图片尺寸:160x60
模拟识别中...
识别结果:M7QG

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