Go语言实战:结合OpenCV和Tesseract实现图像验证码识别

在自动化测试、数据抓取等场景中,验证码识别是常见需求。本文将介绍如何使用Go语言结合OpenCV进行图像预处理,并调用Tesseract OCR识别验证码中的字符。

一、环境准备

  1. 安装Tesseract OCR

sudo apt install tesseract-ocr # Ubuntu
brew install tesseract # macOS
2. 安装依赖Go包

go get github.com/otiai10/gosseract/v2
go get gocv.io/x/gocv
gosseract: 用于调用Tesseract OCR

gocv: Go语言的OpenCV绑定,用于图像预处理

二、图像预处理 + 验证码识别代码
以下是一个完整示例程序,步骤包括:

加载图片

转为灰度图

二值化处理(去除背景干扰)

OCR识别

package main

import (
"fmt"
"image"
"log"

"github.com/otiai10/gosseract/v2"
"gocv.io/x/gocv"

)

func preprocessImage(inputPath, outputPath string) {
img := gocv.IMRead(inputPath, gocv.IMReadColor)
if img.Empty() {
log.Fatalf("无法读取图片: %s", inputPath)
}
defer img.Close()

gray := gocv.NewMat()
defer gray.Close()
gocv.CvtColor(img, &gray, gocv.ColorBGRToGray)

binary := gocv.NewMat()
defer binary.Close()
gocv.Threshold(gray, &binary, 100, 255, gocv.ThresholdBinaryInv)

gocv.IMWrite(outputPath, binary)

}

func recognizeCaptcha(imagePath string) string {
client := gosseract.NewClient()
defer client.Close()

client.SetImage(imagePath)
client.SetWhitelist("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")

text, err := client.Text()
if err != nil {
	log.Fatalf("OCR识别失败: %v", err)
}
return text

}

func main() {
inputImage := "captcha.png"
processedImage := "processed.png"

preprocessImage(inputImage, processedImage)
result := recognizeCaptcha(processedImage)

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

}
三、测试
使用一张验证码图片,如 captcha.png,内容为 M8K5。运行程序:

go run main.go
输出示例:

识别结果: M8K5
四、优化方向
可加入旋转、腐蚀、膨胀等图像处理手段,提高鲁棒性

将图像切割为单字符,提高识别准确率

用Python训练好深度学习模型后通过ONNX导出,Go中使用ONNX Runtime进行推理

posted @ 2025-05-28 23:06  ttocr、com  阅读(45)  评论(0)    收藏  举报