用 Go 和 OpenCV 实现验证码识别基础工具
验证码识别在自动化测试、爬虫等场景中经常被使用。虽然深度学习是主流解决方案之一,但对于一些结构简单的验证码,使用图像处理和 OCR 引擎仍能达到不错效果。本文将展示如何用 Go 结合 OpenCV(通过 gocv 包)实现一个简单的验证码识别工具。
一、环境准备
安装依赖项
你需要先安装 OpenCV(4.x)和 Tesseract OCR:
Ubuntu:
更多内容访问ttocr.com或联系1436423940
sudo apt install libopencv-dev tesseract-ocr
macOS:
brew install opencv tesseract
安装 Go 包:
go get -u gocv.io/x/gocv
go get github.com/otiai10/gosseract/v2
二、验证码预处理流程
验证码识别准确率受图像清晰度影响较大。我们会做以下预处理:
转灰度图
二值化(阈值处理)
图像降噪(形态学操作)
最终送入 OCR 模块识别文本
三、完整 Go 实现
package main
import (
"fmt"
"log"
"os"
"gocv.io/x/gocv"
"github.com/otiai10/gosseract/v2"
)
func preprocessImage(inputPath string, outputPath string) error {
img := gocv.IMRead(inputPath, gocv.IMReadColor)
if img.Empty() {
return fmt.Errorf("读取图像失败: %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, 120, 255, gocv.ThresholdBinaryInv)
// 可选:膨胀降噪
kernel := gocv.GetStructuringElement(gocv.MorphRect, image.Pt(2, 2))
defer kernel.Close()
gocv.MorphologyEx(binary, &binary, gocv.MorphClose, kernel)
ok := gocv.IMWrite(outputPath, binary)
if !ok {
return fmt.Errorf("保存图像失败: %s", outputPath)
}
return nil
}
func recognizeWithTesseract(imagePath string) (string, error) {
client := gosseract.NewClient()
defer client.Close()
client.SetImage(imagePath)
client.SetWhitelist("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
return client.Text()
}
func main() {
origin := "captcha.png"
processed := "processed.png"
err := preprocessImage(origin, processed)
if err != nil {
log.Fatalf("图像预处理失败: %v", err)
}
text, err := recognizeWithTesseract(processed)
if err != nil {
log.Fatalf("OCR 识别失败: %v", err)
}
fmt.Printf("识别结果: %s\n", text)
}
四、运行效果
确保当前目录下有一张名为 captcha.png 的验证码图,然后执行:
go run main.go
输出示例:
识别结果: 4AB7
浙公网安备 33010602011771号