Go 和 OpenCV 实现验证码识别基础工具

验证码识别在自动化测试、爬虫等场景中经常被使用。虽然深度学习是主流解决方案之一,但对于一些结构简单的验证码,使用图像处理和 OCR 引擎仍能达到不错效果。本文将展示如何用 Go 结合 OpenCV(通过 gocv 包)实现一个简单的验证码识别工具。

一、环境准备
安装依赖项
你需要先安装 OpenCV(4.x)和 Tesseract OCR:

Ubuntu:

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

posted @ 2025-06-02 22:08  ttocr、com  阅读(51)  评论(0)    收藏  举报