首页 > 其他分享 >使用 Go 语言与 Tesseract 进行验证码识别

使用 Go 语言与 Tesseract 进行验证码识别

时间:2025-01-21 22:12:08浏览次数:1  
标签:OCR err 验证码 识别 图像 Go Tesseract

验证码(CAPTCHA)作为一种常见的防止自动化脚本的安全措施,广泛应用于各种网站和应用程序中。为了突破验证码的防护,可以通过 OCR(光学字符识别)技术自动识别验证码中的文本。Tesseract 是一个开源的 OCR 引擎,能够识别图像中的文字。在本文中,我们将介绍如何使用 Go 语言和 Tesseract OCR 引擎来实现验证码的自动识别。

  1. 环境准备
    在开始编写代码之前,首先确保你已经安装了 Go 编程语言和 Tesseract 引擎。

安装 Go 语言
如果你尚未安装 Go,可以访问 Go 官网 下载并安装最新版的 Go 语言。

安装完成后,使用以下命令检查 Go 是否安装成功:

bash
更多内容访问ttocr.com或联系1436423940
go version
安装 Tesseract OCR 引擎
Tesseract 是一个开源的 OCR 引擎,必须单独安装。可以从 Tesseract 官方 GitHub 页面 下载并安装 Tesseract。

Windows 用户可以下载适用于 Windows 的安装包并按照安装向导进行安装。
Linux (Ubuntu) 用户可以通过以下命令安装:
bash

sudo apt install tesseract-ocr
macOS 用户可以使用 Homebrew 安装:
bash

brew install tesseract
安装完成后,使用以下命令检查 Tesseract 是否安装成功:

bash

tesseract --version
安装 Go Tesseract 库
为了在 Go 中使用 Tesseract,我们需要使用一个 Go 的 Tesseract 接口库 —— go-ocr. 通过以下命令安装该库:

go get -u github.com/otiai10/gosseract/v2
2. 编写验证码识别代码
在本节中,我们将使用 Go 编写一个简单的程序,加载验证码图像并通过 Tesseract 进行文字识别。以下是完整的代码示例:

go

package main

import (
"fmt"
"github.com/otiai10/gosseract/v2"
"image"
"image/color"
"log"
"os"
"github.com/nfnt/resize"
"github.com/disintegration/imaging"
)

func main() {
// 加载验证码图像
imagePath := "captcha.png" // 替换为你的验证码图片路径
imgFile, err := os.Open(imagePath)
if err != nil {
log.Fatalf("打开图像文件失败: %v", err)
}
defer imgFile.Close()

// 解析图像
img, _, err := image.Decode(imgFile)
if err != nil {
	log.Fatalf("解码图像失败: %v", err)
}

// 处理图像:转换为灰度图
grayImg := imaging.Grayscale(img)

// 可选:调整图像大小,提升 OCR 准确率
// resizedImg := resize.Resize(0, 50, grayImg, resize.Lanczos3)

// 二值化处理:转为黑白图像
thresholdImg := image.NewRGBA(grayImg.Bounds())
for y := 0; y < grayImg.Bounds().Dy(); y++ {
	for x := 0; x < grayImg.Bounds().Dx(); x++ {
		grayColor := color.GrayModel.Convert(grayImg.At(x, y)).(color.Gray)
		// 如果像素值大于某个阈值,转为白色,否则为黑色
		if grayColor.Y > 128 {
			thresholdImg.Set(x, y, color.White)
		} else {
			thresholdImg.Set(x, y, color.Black)
		}
	}
}

// 保存处理后的图像(可选)
outputImage := "processed_captcha.png"
outFile, err := os.Create(outputImage)
if err != nil {
	log.Fatalf("创建输出文件失败: %v", err)
}
defer outFile.Close()

// 将处理后的图像保存到文件
err = imaging.Encode(outFile, thresholdImg, imaging.PNG)
if err != nil {
	log.Fatalf("保存图像失败: %v", err)
}

// 使用 Tesseract 进行 OCR 识别
client := gosseract.NewClient()
defer client.Close()

// 设置处理后的图像路径
client.SetImage(outputImage)

// 获取识别的文本
text, err := client.Text()
if err != nil {
	log.Fatalf("OCR 识别失败: %v", err)
}

// 打印识别的验证码
fmt.Printf("识别的验证码是: %s\n", text)

}
3. 代码解析
图像加载与处理
加载图像:

通过 Go 标准库的 os.Open 和 image.Decode 函数加载并解析验证码图像。确保在代码中替换 imagePath 为实际的图像文件路径。
灰度化:

使用 imaging.Grayscale(img) 将图像转换为灰度图像。这是因为颜色信息会增加 OCR 引擎的处理负担,灰度图能够提供更清晰的字符信息。
二值化处理:

在图像转换为灰度后,我们通过阈值化将图像转换为黑白二值图像。对于每个像素,若其灰度值大于 128,则将其设置为白色,否则设置为黑色。这有助于将字符与背景分离,提升识别准确度。
调整图像大小(可选):

有时,调整图像的大小可以提高识别精度。例如,将图像的高度调整为固定值 50 像素,可以改善 OCR 引擎对细节的识别。此步骤是可选的,依据实际情况决定是否需要。
OCR 识别
我们使用 gosseract 库提供的 client.SetImage() 设置处理后的图像路径,然后调用 client.Text() 获取 OCR 引擎识别的文本内容。
输出识别结果
最后,我们打印出识别到的验证码。如果验证码是 X1Y2Z3,程序的输出将是:
text

识别的验证码是: X1Y2Z3
4. 运行程序
将代码保存为 captcha_recognition.go,确保图像文件(例如 captcha.png)与代码位于同一目录下。然后,使用以下命令运行程序:

bash

go run captcha_recognition.go
程序将加载验证码图像,处理并输出识别结果。

  1. 提高识别准确度
    Tesseract 在简单验证码图像中的识别表现通常不错,但对于复杂或扭曲的验证码,可能需要做一些额外的图像处理和配置调整。以下是一些建议:

  2. 调整图像大小
    在某些情况下,调整图像的分辨率可能会帮助 OCR 引擎更好地识别字符。通过 resize.Resize() 可以对图像进行缩放,特别是在验证码文字过小或模糊时。

  3. 调整 Tesseract 配置
    Tesseract 提供了许多参数和选项来调整其行为。例如,可以通过设置 client.SetVariable() 来调整 OCR 引擎的配置,例如页面分割模式(PSM)。对于有单一文本块的验证码,可以尝试使用 --psm 6 配置。

  4. 深度学习方法
    对于非常复杂或扭曲的验证码,Tesseract 可能无法达到很好的识别效果。在这种情况下,你可以尝试使用其他 OCR 引擎,如基于深度学习的 EasyOCR 或 PaddleOCR,这些模型能够更好地处理复杂验证码图像。

标签:OCR,err,验证码,识别,图像,Go,Tesseract
From: https://www.cnblogs.com/ocr12/p/18684546

相关文章

  • ✅毕业设计:基于python商品销售数据分析可视化系统 ARIMA 时序预测模型 淘宝商品数据分
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • MongoDB 语句以及IDEA使用
    MongoDB语句--查询当前已存在库showdbs--生成库usemydbusemydemo--删除库db.dropDatabase()--查看已存在的集合showcollections--生成表格(集合)db.createCollection("mytable")--修改表格名称(集合)db.adminCommand({ renameCollection:"mydemo.mydemo.mytable",--需要......
  • Django中使用Vue语法冲突解决
    1、方案verbatim标签1-1、django1.5以后,加入了verbatim标签{%verbatimvueblock%}...{%endverbatimvueblock%}注:vueblock设置的标签别名,可以很好的分别标签使用1-2、verbatim标签使用示例<!DOCTYPEhtml><htmllang="en"><head><metach......
  • Django和FastAPI的比较
    在Python的Web开发领域,Django和FastAPI是两款备受瞩目的框架。通过对二者的实践与比较,本文总结了它们的特点与适用场景,希望能给开发者在选择时提供参考。1.设计理念的比较从框架的特性来看,Django以全栈式框架著称,内置诸多工具,涵盖ORM、数据验证、认证、会话管理、缓......
  • Django学习笔记(安装和环境配置)-01
    Django学习笔记(安装和环境配置)-01一、创建python环境1、可以通过安装Anaconda来创建一个python环境#创建一个虚拟python环境condacreate-ndjangopython=3.8#切换激活到创建的环境中activatedjango2、安装django#进入虚拟环境中安装django框架pipinstal......
  • 瞬间成为MongoDB专家,8个脚本都写好了,一用一个不吱声【转】
    MongoDB最近一直在写文言文,但咱们MongoDB也是武行出身,今天就说说那些MongoDB的具有一些技术含量,且你需要的脚本,有这些脚本,能让小白快速解决一些问题,短暂冒充小专家。这里需要注意,运行下面的脚本,一定要使用mongosh,不会装的看下面的,其实不用装,下载就放到Linux中的/bin中就可以了......
  • 一个由 Go 语言开发的开源屏幕共享工具,免费好用,高质量无延迟,保证数据安全(带私活源码)
    想必大家在日常的工作中,会经常需要分享代码、演示项目或者进行在线教学,这就需要一个既高效又便捷的屏幕共享工具。然而,现有的一些解决方案往往存在延迟高、画质差等问题。今天就分享一个开源的屏幕共享项目-screego,不但免费,还能在我们自己的服务器上运行,保证数据安全。项......
  • Golang Gin系列-6:Gin 高级路由及URL参数
    在本章中,我们将深入研究使用Gin框架的高级路由和URL参数。我们将介绍如何创建和使用路由组、应用中间件、提取路径参数、处理查询字符串、处理静态文件以及使用HTML模板。路由分组为什么要使用路由组?使用路由组有助于保持代码结构整洁有序。当路由被逻辑分组时,它变得更......
  • Go语言学习----Go优势及安装
    1,脚本化的语法;开发效率高,容易上手2,静态类型+编译型,程序运行速度有保障,速度大于动态类型+解释型语言,速度高出很多3,原生的支持并发编程;降低开发、维护成本/程序可以更好的执行Go语言的劣势1,语法糖并没有Python和Ruby那么多2,目前的程序运行速度还不及C,速度已赶超C++和java3......
  • relation goes to calmness that is reassuring but not very exciting
    Whenweconfuseassertionwithaggression,neutralizeotherness,adjustourlongings,andreasonawayourhostility,weassembleacalmnessthatisreassuringbutnotveryexciting.StephenMitchellmakesthepointthatthecapacitytocontainaggressionis......