用 Go 语言识别英文数字验证码图像
验证码识别是自动化领域的一个经典问题,本文将演示如何使用 Go 语言结合 Tesseract OCR 来识别英文数字验证码。我们将使用图像处理库和调用 Tesseract 命令行工具,完成图像加载、处理和文本提取。
一、准备工作
- 安装 Tesseract OCR
你需要先在系统中安装 Tesseract OCR。
Linux(Ubuntu/Debian)
sudo apt-get install tesseract-ocr
macOS(Homebrew)
更多内容访问ttocr.com或联系1436423940
brew install tesseract
Windows
从 https://github.com/tesseract-ocr/tesseract 下载并安装,确保将 Tesseract 可执行路径加入系统环境变量。
二、安装 Go 图像处理依赖
我们需要使用 Go 的图像处理标准库和一些工具包进行预处理。
创建项目文件夹并初始化模块:
mkdir go-captcha-ocr
cd go-captcha-ocr
go mod init go-captcha-ocr
创建 main.go 文件,并使用以下代码。
三、识别验证码图像
package main
import (
"fmt"
"image"
"image/color"
"image/png"
"os"
"os/exec"
)
func toGray(input string, output string) error {
// 打开图像文件
file, err := os.Open(input)
if err != nil {
return err
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
return err
}
// 创建灰度图
bounds := img.Bounds()
grayImg := image.NewGray(bounds)
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
for x := bounds.Min.X; x < bounds.Max.X; x++ {
originalColor := img.At(x, y)
grayColor := color.GrayModel.Convert(originalColor)
grayImg.Set(x, y, grayColor)
}
}
// 保存为新图像
outFile, err := os.Create(output)
if err != nil {
return err
}
defer outFile.Close()
return png.Encode(outFile, grayImg)
}
func recognizeWithTesseract(imagePath string) (string, error) {
cmd := exec.Command("tesseract", imagePath, "stdout", "-l", "eng", "--psm", "7")
output, err := cmd.Output()
if err != nil {
return "", err
}
return string(output), nil
}
func main() {
inputPath := "captcha.png"
grayPath := "gray_captcha.png"
fmt.Println("预处理图像...")
err := toGray(inputPath, grayPath)
if err != nil {
fmt.Println("图像处理失败:", err)
return
}
fmt.Println("识别中...")
text, err := recognizeWithTesseract(grayPath)
if err != nil {
fmt.Println("识别失败:", err)
return
}
fmt.Println("识别结果:", text)
}
四、运行程序
确保当前目录中有一个 captcha.png 文件,然后运行程序:
go run main.go
输出可能如下:
预处理图像...
识别中...
识别结果: A7X3F
五、优化建议
可以使用开源 Go 图像处理库(如 github.com/disintegration/imaging)进行更复杂的操作(锐化、去噪等)。
对验证码背景复杂的情况,可结合边缘检测或二值化方法进行改进。
可将识别结果集成到 Web API,结合 Gin 或 Fiber 框架提供接口服务。
浙公网安备 33010602011771号