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

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

时间:2025-01-12 23:21:15浏览次数:1  
标签:Tesseract err 识别 client 图像 Go OCR

一、安装与配置
安装 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) / 3
		grayImg.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 识别。

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

相关文章

  • 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......
  • golang 函数和方法的区别
    golang函数和方法的区别一句话总结就是,func直接函数名就是函数,否则就是方法.至于是谁的的方法,看函数前面有没有*号的指向.golang中函数第一等公民,所以以函数优先.demo\main.gopackagemainimport"fmt"//定义一个结构体typeStudentstruct{ namestring age......