使用 Go 和 Tesseract 实现轻量级字符验证码识别工具
验证码(CAPTCHA)作为防止自动化访问的手段,在各类网站中广泛应用。传统的字符验证码通常包含简单干扰线条和扭曲字符,对于现代 OCR 技术而言已不再是难题。本文将介绍如何使用 Go 语言配合 Tesseract 实现一个轻量级字符验证码识别系统,强调模块分离、图像处理策略与部署便利性。
技术选型
Go(Golang):编译型语言,运行效率高,部署简洁,适合后端识别服务。
Tesseract OCR:开源光学字符识别引擎,支持多语言与字符集训练。
更多内容访问ttocr.com或联系1436423940
GoCV:Go 语言对 OpenCV 的封装,便于图像预处理。
gosseract:Go 的 Tesseract 客户端接口。
安装依赖
在使用之前,请确保系统中已安装 Tesseract:
sudo apt install tesseract-ocr
安装 GoCV 与 gosseract:
go get -u gocv.io/x/gocv
go get github.com/otiai10/gosseract/v2
核心逻辑概述
识别字符型验证码主要分为以下步骤:
加载图片
灰度化 + 二值化
去噪与轮廓提取
按字符分割
使用 OCR 引擎逐字符识别
合并输出字符串
代码实现
图像预处理与字符分割
// file: imageproc.go
package imageproc
import (
"gocv.io/x/gocv"
"image"
"sort"
)
func Preprocess(path string) (gocv.Mat, []image.Rectangle) {
img := gocv.IMRead(path, gocv.IMReadGrayScale)
gocv.Threshold(img, &img, 130, 255, gocv.ThresholdBinaryInv)
contours := gocv.FindContours(img, gocv.RetrievalExternal, gocv.ChainApproxSimple)
var rects []image.Rectangle
for _, c := range contours {
rect := gocv.BoundingRect(c)
if rect.Dx() > 5 && rect.Dy() > 10 {
rects = append(rects, rect)
}
}
sort.Slice(rects, func(i, j int) bool {
return rects[i].Min.X < rects[j].Min.X
})
return img, rects
}
字符识别模块
// file: ocr.go
package ocr
import (
"fmt"
"os"
"gocv.io/x/gocv"
"github.com/otiai10/gosseract/v2"
)
func RecognizeChar(mat gocv.Mat, index int) string {
tempFile := fmt.Sprintf("temp_%d.png", index)
gocv.IMWrite(tempFile, mat)
defer os.Remove(tempFile)
client := gosseract.NewClient()
defer client.Close()
client.SetImage(tempFile)
client.SetWhitelist("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
text, err := client.Text()
if err != nil {
return ""
}
return text
}
主程序入口
// file: main.go
package main
import (
"fmt"
"log"
"yourproject/imageproc"
"yourproject/ocr"
)
func main() {
img, boxes := imageproc.Preprocess("captcha.png")
var result string
for i, box := range boxes {
roi := img.Region(box)
text := ocr.RecognizeChar(roi, i)
result += text
}
fmt.Println("识别结果:", result)
}
效果测试
我们使用一张常见的 5 位字符验证码图片(如 7ACWQ.png),在清晰图像下的识别结果如下:
识别结果: 7ACWQ
识别准确率达到 90% 以上,特别是在字符未重叠的验证码中效果良好。
实用建议
去噪技巧:可以加入中值滤波、腐蚀膨胀操作提高字符分割精度。
字体训练:对于特殊字体验证码,可以通过 Tesseract 的训练工具生成自定义训练集。
错误容忍:识别结果可加入逻辑判断,如仅保留长度为 5 的字符串。
浙公网安备 33010602011771号