首页 > 其他分享 >Go 语言与 Tesseract OCR 实现英文数字验证码识别

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

时间:2025-01-12 23:22:09浏览次数:1  
标签:OCR nil err client Go Tesseract 识别

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

一、安装与配置
安装 Tesseract OCR

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

Ubuntu(Linux):

bash
更多内容访问ttocr.com或联系1436423940
sudo apt-get update
sudo apt-get install tesseract-ocr
macOS:

bash

brew install tesseract
Windows: 下载并安装 Tesseract 的 Windows 安装包。

安装 Go 的 Tesseract 库

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

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

bash

go get -u github.com/otiai10/gosseract
创建 Go 项目

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

bash

mkdir captcha-recognition
cd captcha-recognition
go mod init captcha-recognition
二、Go 代码实现验证码识别
以下是完整的 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 文件中添加以下依赖:

bash

go get -u github.com/nfnt/resize
然后,你可以修改代码来进行图像的灰度化和二值化处理:

go

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)

}

标签:OCR,nil,err,client,Go,Tesseract,识别
From: https://www.cnblogs.com/ocr12/p/18667594

相关文章

  • Go 语言与 Tesseract OCR 识别英文数字验证码
    一、安装与配置安装TesseractOCR你需要先安装TesseractOCR引擎。具体步骤如下:Ubuntu:bashsudoapt-getupdatesudoapt-getinstalltesseract-ocrmacOS:bashbrewinstalltesseractWindows:可以从TesseractGitHub下载并安装Tesseract。安装Go的Tesseract......
  • Go2 slam mid-360 Error
      unitree@ubuntu:/unitree/module/graph_pid_ws$unitree@ubuntu:/unitree/module/graph_pid_ws$./0_unitree_slam.sh[INFO][launch]:Alllogfilescanbefoundbelow/home/unitree/.ros/log/1970-01-21-16-38-10-111580-ubuntu-4450[INFO][launch]:Defaultlo......
  • 算法-查找滑动窗口中的最大值-Go(滑动窗口)
    题目给定一个长度为n的数组num和滑动窗口的大小size,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:{[2,3,4],2,6,2,5,1},{......
  • 读书记录--GO语言高级编程
    20240220问题记录如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的init函数,如果一个包有多个init函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同......
  • 基于django中医药数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
    摘要时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,中医药管理平台当然不能排除在外。中医药数据可视化平台是在实际应用和软件工程的开发原理之上,运用Python语言、ECharts技术、爬虫技术以及Django框架进行开发,可以让用户实现在线......
  • 基于Django自然灾害频发地区情况数据分析系统
    一、前言......
  • VS Code+Gitee+Picgo实现图床
    在VSCode中结合Gitee图床和PicGo插件,解决Markdown文档插入图片的问题。步骤一、在VSCode中安装Picgo插件步骤二、在系统中安装Picgo软件进入PicGo官网:https://molunerfinn.com/PicGo/。下载最新版本.exe文件。安装完成后,打开PicGo,点击插件设置,搜索gitee,安装gitee-uploader......
  • AT_abc388_f Dangerous Sugoroku 题解
    太幽默了。显然可以用矩阵快速幂解决,矩阵里维护距离当前点\(B\)以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度\(O(B^3m\logn)\)。然后你就T了。此时你很急,你现在应该快点卡常来AK这场比赛而不是研究其他的做法,于是我们发现快速幂......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......
  • golang中 &和*的区别
    golang中&和*的区别&用于获取地址*用于声明时,就是声明指针类型,用于解引用时,就是解引用指针。&是取地址操作符,用于获取变量的内存地址。例如:packagemainimport"fmt"funcmain(){varnumint=10//获取num的地址并赋值给pp:=&num......