Go 语言与 Tesseract OCR 识别英文数字验证码

news/2025/1/12 23:20:06/文章来源:https://www.cnblogs.com/ocr12/p/18667601

一、安装与配置
安装 Tesseract OCR

你需要先安装 Tesseract OCR 引擎。具体步骤如下:

Ubuntu:

bash

sudo apt-get update
sudo apt-get install tesseract-ocr
macOS:

bash

brew install tesseract
Windows: 可以从 Tesseract GitHub 下载并安装 Tesseract。

安装 Go 的 Tesseract 库

我们需要安装一个 Go 语言的 Tesseract 包来进行 OCR 识别。可以通过 go get 命令安装:

bash

go get github.com/otiai10/gosseract
这个库是 Go 语言对 Tesseract 的封装,方便我们直接调用 Tesseract 的功能。

创建一个新的 Go 项目

在你的工作目录下,创建一个新的 Go 项目:

bash

mkdir captcha_recognition
cd captcha_recognition
go mod init captcha_recognition
二、Go 代码实现验证码识别
go

package main

import (
"fmt"
"log"

"github.com/otiai10/gosseract"

)

func main() {
// 创建 Tesseract 客户端
client := gosseract.NewClient()
defer client.Close()

// 设置语言为英文
client.SetLanguage("eng")// 设置字符白名单:只允许字母和数字
client.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")// 设置图像路径
imagePath := "captcha.jpg"// 设置图片供 Tesseract 进行识别
client.SetImage(imagePath)// 获取识别的文本
text, err := client.Text()
if err != nil {log.Fatalf("识别失败: %v", err)
}// 输出识别结果
fmt.Println("识别结果:", text)

}
三、代码解析
创建 Tesseract 客户端

使用 gosseract.NewClient() 创建一个新的 Tesseract 客户端,这个客户端会用来进行 OCR 识别。defer client.Close() 确保在程序结束时关闭客户端。

设置语言与字符白名单

使用 SetLanguage("eng") 设置语言为英语(你可以根据需要替换成其他语言)。同时,我们通过 SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") 设置字符白名单,限制 OCR 识别过程中只允许英文字母和数字,从而提高识别的准确性。

加载图像并执行 OCR

使用 SetImage(imagePath) 加载要识别的验证码图像,然后调用 client.Text() 获取识别后的文本。

输出识别结果

如果识别成功,Text() 方法将返回识别出的文本内容,并输出到控制台。

四、图像预处理(可选)
如果验证码图像质量较差(如背景杂乱、字符模糊等),可能需要对图像进行预处理,以便提高识别的准确性。Go 中可以使用一些图像处理库来完成这类任务。

安装图像处理库

我们可以使用 github.com/nfnt/resize 库进行图像缩放,或者使用 github.com/disintegration/imaging 进行更多的图像处理,如转换为灰度图、裁剪等。

通过以下命令安装:

bash

go get github.com/nfnt/resize
示例:图像灰度化与缩放

在进行 OCR 识别之前,可以先将图像转化为灰度图并缩放:

go
更多内容访问ttocr.com或联系1436423940
package main

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

func preprocessImage(imagePath string) (image.Image, error) {
// 打开图像文件
file, err := os.Open(imagePath)
if err != nil {
return nil, err
}
defer file.Close()

// 解码图像
img, _, err := image.Decode(file)
if err != nil {return nil, err
}// 转换为灰度图
grayImg := image.NewGray(img.Bounds())
for y := 0; y < img.Bounds().Dy(); y++ {for x := 0; x < img.Bounds().Dx(); x++ {r, g, b, _ := img.At(x, y).RGBA()gray := (r + g + b) / 3grayImg.Set(x, y, color.Gray{uint8(gray >> 8)})}
}// 缩放图像(可选)
resizedImg := resize.Resize(200, 0, grayImg, resize.Lanczos3)return resizedImg, nil

}

func main() {
// 预处理图像
imagePath := "captcha.jpg"
processedImg, err := preprocessImage(imagePath)
if err != nil {
log.Fatalf("图像预处理失败: %v", err)
}

// 将处理后的图像保存为临时文件
outputPath := "processed_captcha.jpg"
outputFile, err := os.Create(outputPath)
if err != nil {log.Fatalf("创建临时文件失败: %v", err)
}
defer outputFile.Close()// 将处理后的图像保存为 JPEG 格式
err = jpeg.Encode(outputFile, processedImg, nil)
if err != nil {log.Fatalf("保存图像失败: %v", err)
}// 创建 Tesseract 客户端
client := gosseract.NewClient()
defer client.Close()// 设置语言为英文
client.SetLanguage("eng")// 设置字符白名单:只允许字母和数字
client.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")// 设置图像文件供 Tesseract 进行识别
client.SetImage(outputPath)// 获取识别的文本
text, err := client.Text()
if err != nil {log.Fatalf("识别失败: %v", err)
}// 输出识别结果
fmt.Println("识别结果:", text)

}
五、代码解析
图像预处理

我们首先打开图像文件并解码成 image.Image 格式。然后,我们将图像转化为灰度图。灰度化的过程是通过提取每个像素的红绿蓝(RGB)值并取其平均值来实现的。

缩放图像

为了提高 OCR 识别的准确性,我们可以将图像进行缩放。这里使用 resize.Resize() 来调整图像的尺寸。你可以根据需要调整图像大小。

保存图像

处理后的图像被保存为临时文件 processed_captcha.jpg,然后用来进行 OCR 识别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868402.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Raspberry PI】Raspberry PiSP摄像头前端(rpl-cfe)

1.PiSP相机前端 PiSP 摄像头前端 (CFE) 是一个将 CSI-2 接收器与 一个简单的 ISP,称为前端 (FE)。 CFE 有四个 DMA 引擎,可以从四个单独的流写入帧 从 CSI-2 接收到内存。也可以路由其中一个流 直接给 FE 做最少的图片处理,写两个版本 (例如,未缩放和缩小版本)将接收…

一文看懂“高大上”的边缘计算!!

一、边缘计算(Edge Computing) 边缘计算是一种分布式计算架构,其核心思想是将计算、存储和数据处理任务从云端推到靠近数据源的设备或网络边缘。通过这种方式,数据可以在本地(离数据源更近的地方)进行处理,从而减少延迟、减轻带宽负担、提高处理效率,并降低对远程数据中…

使用 CompletableFuture 实现异步编程

使用 CompletableFuture 实现异步编程 在现代 Java 开发中,异步编程是一项重要使用 CompletableFuture 实现异步编程 在现代 Java 开发中,异步编程是一项重要技能。而 CompletableFuture 是从 Java 8 开始提供的一个功能强大的工具,用于简化异步任务的编写和组合。本文将详细…

PCIe总线-存储器域和PCIe总线域访问流程分析(二)

1.概述 PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转…

在Windows上调试iOS Safari中的H5页面

本次开发的web页面需要适配移动端,第一个版本在发布到线上,发现ios设备一直打不开网页,无论是自带的safari浏览器还是其他浏览器,页面经常出现“***页面重复出现错误”,但是在本地以及使用PC浏览器模拟都没有复现该问题。为了进行线上的调试查询了一下如何在windows上调试…

大模型AI应用场景及产品汇总(持续更新)

一、文生图 1. Napkin AINapkin AI 可以基于输入的文本生成各种图示,例如流程图、逻辑关系图等等。https://app.napkin.ai/

大模型AI应用场景汇总(持续更新)

一、文生图 1. Napkin AINapkin AI 可以基于输入的文本生成各种图示,例如流程图、逻辑关系图等等。https://app.napkin.ai/

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳理Mixed …

AlexNet文献阅读与代码实现

目录AlexNet文献阅读与代码实现文献内容介绍代码实现内容总结 AlexNet文献阅读与代码实现前言:笔者目前研一,刚开始入门深度学习,所以想记录一下自己学习的过程,接下来的时间里,我会定期阅读深度学习领域的经典文献,并尝试用代码实现它们,也欢迎大家积极评论。注:博客本…

c语言的基本类型及输入输出占位符

基本类型 c语言的基本类型:int 【long、short、unsigned、signed(c90)】、char、float、double、_Bool【布尔值】、_complex、_Imaginary【复数和虚数】 输入输出 printf标志字符标志 含义- 转换的结果在字段内左对齐+ 有符号的转换结果总是以+或者-开始空格 如果有符号转换的…

LeetCode:65.有效数字

LeetCode:65.有效数字解题步骤构建一个表示状态的图。遍历字符串,并沿着图走,如果到了某个节点无路可走就返false。遍历结束,如走到3/5/6,就返回true,否则返回false。 extend 2 8 10 16进制 /*** 检查一个字符串是否可以表示为一个有效的数字* @param {string} s - 待检查的…

vs2019项目报错:文件中的类都不能进行设计,解决办法_无法设计基类system.void

文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: Form1 --- 无法设计基类“System.Void”。 出现上述错误,解决办法如下: 关闭所有设计窗口(例如form1.cs(设计)),菜单栏生成,清理解决方案,关闭vs2022,重新启动vs2022打开你的项目…