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

news/2025/9/18 23:08:32/文章来源:https://www.cnblogs.com/ocr12/p/19099894

Go 语言本身不直接支持图像识别,但可以通过调用 Tesseract OCR 引擎来进行图像识别。我们可以使用 Go 的 tesseract 包来实现这一功能。

一、安装与配置

安装 Tesseract OCR

首先,你需要在系统中安装 Tesseract OCR。安装方法和前面一样:

Ubuntu(Linux):

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

macOS:

brew install tesseract

Windows:
下载并安装 Tesseract 的 Windows 安装包

安装 Go 的 Tesseract 库

Go 语言有一个 Tesseract 库,叫做 github.com/otiai10/gosseract,我们需要将它安装到项目中。

在你的 Go 项目中运行以下命令来安装该库:

go get -u github.com/otiai10/gosseract

创建 Go 项目

如果你还没有 Go 项目,可以通过以下命令创建一个新的 Go 项目:

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()

// 设置 OCR 的语言为英文
client.SetLanguage("eng")// 设置字符白名单,限制只识别字母和数字
client.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")// 识别图片中的文本
err := client.SetImage("captcha.jpg")
if err != nil {log.Fatalf("设置图片失败: %v", err)
}// 获取识别结果
text, err := client.Text()
if err != nil {log.Fatalf("识别文本失败: %v", err)
}// 输出识别结果
fmt.Printf("识别结果: %s\n", text)

}

三、代码解析

创建 Tesseract 客户端:
我们通过 gosseract.NewClient() 创建一个 Tesseract 客户端,负责调用 Tesseract OCR 引擎进行图像识别。

设置 OCR 语言:
使用 client.SetLanguage("eng") 设置识别语言为英文。

设置字符白名单:
为了提高识别准确性,使用 client.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") 限制 Tesseract 只识别字母和数字,这样能够避免一些非字母数字字符的干扰。

加载图像:
通过 client.SetImage("captcha.jpg") 加载需要识别的图像文件。

获取识别结果:
使用 client.Text() 获取图像中的文本内容,即验证码中的字符。

四、图像预处理

和其他语言类似,验证码图像可能会包含噪点或干扰,影响识别的准确性。你可以使用图像处理库对图像进行预处理,以提高识别效果。

Go 语言有一个非常强大的图像处理库,叫做 github.com/nfnt/resize,可以用来对图像进行裁剪、缩放等处理。

在 go.mod 文件中添加以下依赖:

go get -u github.com/nfnt/resize

然后,你可以修改代码来进行图像的灰度化和二值化处理:

package main

import (
"fmt"
"log"
"github.com/otiai10/gosseract"
"github.com/nfnt/resize"
"image"
"image/color"
_ "image/jpeg" // JPEG 图片解码器
_ "image/png" // PNG 图片解码器
"os"
)

func preprocessImage(imagePath string) (image.Image, error) {
// 打开图片文件
file, err := os.Open(imagePath)
if err != nil {
return nil, fmt.Errorf("打开图片失败: %v", err)
}
defer file.Close()

// 解码图片
img, _, err := image.Decode(file)
if err != nil {return nil, fmt.Errorf("解码图片失败: %v", err)
}// 转换为灰度图像
grayImg := image.NewGray(img.Bounds())
for y := 0; y < img.Bounds().Max.Y; y++ {for x := 0; x < img.Bounds().Max.X; x++ {originalColor := img.At(x, y)r, g, b, _ := originalColor.RGBA()gray := uint8((r + g + b) / 3 / 256)grayImg.Set(x, y, color.Gray{Y: gray})}
}// 可以进一步处理:比如二值化
// 在此简单做个二值化处理
for y := 0; y < grayImg.Bounds().Max.Y; y++ {for x := 0; x < grayImg.Bounds().Max.X; x++ {c := grayImg.At(x, y)gray, _, _, _ := c.RGBA()if gray > 128 {grayImg.Set(x, y, color.Gray{Y: 255})} else {grayImg.Set(x, y, color.Gray{Y: 0})}}
}return grayImg, nil

}

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

// 将处理后的图像保存为文件
outfile, err := os.Create("processed_captcha.png")
if err != nil {log.Fatalf("保存预处理后的图片失败: %v", err)
}
defer outfile.Close()// 将处理后的图像保存到文件
err = png.Encode(outfile, processedImage)
if err != nil {log.Fatalf("编码处理后图像失败: %v", err)
}// 创建 Tesseract 客户端
client := gosseract.NewClient()
defer client.Close()// 设置 OCR 的语言为英文
client.SetLanguage("eng")// 设置字符白名单,限制只识别字母和数字
client.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")// 识别图片中的文本
err = client.SetImage("processed_captcha.png")
if err != nil {log.Fatalf("设置图片失败: %v", err)
}// 获取识别结果
text, err := client.Text()
if err != nil {log.Fatalf("识别文本失败: %v", err)
}// 输出识别结果
fmt.Printf("识别结果: %s\n", text)

}

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

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

相关文章

lc1031-两个非重叠子数组的最大和

难度:中等(中期)题目描述给定一个数组和两个长度,找到两个符合长度的不重合的连续子数组,使其和最大示例 输入:nums = [0,6,5,2,2,5,1,9,4], firstLen = 1, secondLen = 2 输出:20 解释:[6, 5] + [9]输入:num…

Segment Analytics-iOS SDK - 专业用户行为追踪解决方案

Segment Analytics-iOS SDK 是一个专业的iOS用户行为分析库,提供完整的事件追踪、用户识别、屏幕浏览统计等功能,支持多种数据集成方式,帮助开发者高效收集和分析用户行为数据。Segment Analytics-iOS SDK Analytic…

我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi - 行人-

我使用佳能相机,以60FPS高帧率录制视频,来比对 WPF 和 UWP 的动画流畅度,结果: WPF表现吃力和卡顿,UWP表现丝滑和高级。文章是我对.NET Framework 4.6.2框架下的动画方案的选型进行的一些探索和记录。NET Framewo…

US$1198 Xhorse VVDI2 BMW Version With Basic+BMW OBD+BMW CAS4+BMW FEM/BDC

100% Original Xhorse BMW Version With Basic+BMW OBD+BMW CAS4+BMW FEM/BDCThis VVDI2 with Activated Software List:VB-01 BMW OBDVB-02 BMW CAS4VB-03 FEM/BDC FunctionVP-01 Porsche immo data toolVJ-01 Passth…

使用 Rust 与 Tesseract OCR 识别英文数字验证码

一、安装与配置 安装 Tesseract OCR Ubuntu: 更多内容访问ttocr.com或联系1436423940 sudo apt-get update sudo apt-get install tesseract-ocr macOS: brew install tesseract Windows: 从 Tesseract 官方 GitHub…

API安全解决方案选型指南:2025年五大关键维度与厂商推荐

API安全解决方案选型指南:2025年五大关键维度与厂商推荐在数字化转型浪潮中,API已成为连接业务与数据的核心枢纽。随着API数量的爆发式增长,安全威胁也日益复杂:影子API无处不在、敏感数据暴露风险加剧、自动化攻击…

别迷茫了!计算机大一新生这样做,四年后远超同龄人 - 编程实战派

本文是一份专为计算机专业大一新生打造的终极学习指南。文章打破迷茫,从心态重置、学习攻略、实践真知、视野规划四大维度,提供切实可行的建议。强调从“被动学习”转向“主动探索”的思维模式,死磕数学、英语、C语…

解决ifconfig命令没有显示ens33 finalshell连接不上虚拟机

停止并关闭NetworkManager systemctl stop NetworkManagersystemctl disable NetworkManager重启网络服务 systemctl start network

CRM管理专业的系统:从数据收集到价值挖掘

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

什么情况下需要用到xargs

它是 find、grep、ls 等输出类命令的“桥梁”,连接“查找”和“执行”​ xargs 核心作用是:将标准输入(stdin)中的数据转换为命令行参数,并传递给其他命令执行。 总结:当你需要把“文本流”变成“命令参数”时,…

Office 2024安装包专业增强版超详细下载安装教程

在数字化办公浪潮中,Office 2024 专业增强版成为提升办公效率的得力助手。这款功能强大的办公套件,集成了 Word、Excel、PowerPoint、Access、Outlook、OneNote 等多个组件,能够全方位满足日常办公中的文本处理、表…

关于 pdfminer 的安装 - 指南

关于 pdfminer 的安装 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

c/c++实现有栈协程

有栈协程 有栈协程通过切换执行上下文实现,核心是切换栈寄存器和跳转ip代码地址,同时需要保存切换当前编译器ABI规定的 非易失寄存器。 System V AMD64 ABI 和 MSVC x64 ABI 的非易失性寄存器RBX、RBP、RSP、R12、R1…

Day17冒泡排序

package com.cc.array;import java.util.Arrays;public class ArrayDemo7 {public static void main(String[] args) {int [] a = {21,4,5,6,35,65,23,34,53,5};Arrays.sort(a);System.out.println(Arrays.toString(a)…

高阶 INTJ 5w4 整合到 8,是完整的过程,从研究到实用(豆包)

高阶INTJ 5w4整合到8的完整过程,是一个从认知重构、情感突破到行为落地的系统性进化,需要经历理论奠基→动态转化→实践固化三个阶段。以下结合九型人格整合机制、INTJ发展规律及5w4的特质矛盾,展开从研究到实用的全…

RabbitMQ—运维篇 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

几B大模型的空间存储大小

1. 前言砚上三五笔,落墨鹧鸪啼关于大模型总是会出现几B,然后想知道他们的存储空间大小分别是多少。还有描述一些显卡的TFLOPS是怎么计算的。这里做一个简单的记录。 如有不对,欢迎评论区指正! 2. 正文 2.1 精度类型…

hbase安装与配置

解压文件改名配置环境变量配置文件(忘记截图了,问ai即可) cd $HBASE_HOME/conf hbase-env.sh,hbase-site.xml, regionservers 启动前准备 hdfs dfs -mkdir -p /hbase hdfs dfs -chown hadoop:hadoop /hbase 如果各…

发喷山火(volcano)+CF2119F Volcanic Eruptions 解题报告

发喷山火 神题 先来初步挖掘一下这个走路过程的性质:初始时 \(S=1\),且 \(S\le 0\) 就死了,所以在没有走到 \((1,1)\) 之前,只能走 \((1,-1)\) 的边。 由于你和岩浆走路速度相同,所以一旦路径中你已经触碰到岩浆,…

matlab免费下载安装激活教程(附安装包下载)MATLAB R2025a超详细下载安装教程

MATLAB R2025a是2025年工科必备的工程计算软件,不管是大学生做课程设计、研究生写论文,还是工程师搞项目研发,用它处理矩阵运算、建模仿真都特别方便。新版本运算速度比上一代快35%,还新增了新能源、自动驾驶专用工…