失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别

【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别

时间:2023-02-25 00:04:13

相关推荐

【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别

/12/27 有的小伙伴说maven导入不了依赖,加了一种方法,百分百解决。

/12/28 写了半天,想去论坛放松休息下,结果看到别人已经有成品了,难受啊马飞,晚点看情况要不要写个搭建使用方法(我猜没人看,估计也不用写了,就当自己做个记录)

/3/24 更新了一键部署验证码识别!识别率更高,且不用自己训练啦~ 点这里直达

/3/24 更新了一键部署验证码识别!识别率更高,且不用自己训练啦~ 点这里直达

/3/24 更新了一键部署验证码识别!识别率更高,且不用自己训练啦~ 点这里直达

重要的事情说三遍!

1.opencv for java 环境搭建和测试

1.到OpenCV官网下载你需要的版本,运行安装,记住安装目录。2.打开上一步安装的位置,依次打开如下图位置,复制opencv-{version}.jarx64包下对应的dll到项目里,放在同级

/12/28 更新,添加依赖的方式,如下 3.1

3.1. ①项目上点右键,点击open module settings

② 按图中顺序点,点完加号 选jars那个选项,然后找到你opencv-version.jar在的地方,点右下apply就行了

3.2. (不建议,用上边步骤简单)在maven里添加opencv依赖(位置看清楚、版本号改成自己下载的版本,别傻乎乎复制

<dependency><groupId>org</groupId><artifactId>opencv</artifactId><scope>system</scope><systemPath>${project.basedir}\src\main\resources\lib\opencv\opencv-460.jar</systemPath></dependency>

测试代码(记得改链接库地址,别复制

//先静态代码块加载opencv库链接文件和动态库static {// 解决awt报错问题System.setProperty("java.awt.headless", "false");// 加载动态库URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java460.dll");System.load(url.getPath());}/*** 高斯滤波*/public static void GaussianBlur(String path, String resultPath) {// 加载时灰度Mat src = Imgcodecs.imread(path);Mat dst = src.clone();Imgproc.GaussianBlur(src, dst, new Size(9, 9), 0, 0, Core.BORDER_DEFAULT);imwrite(resultPath, dst);}

以上准备工作做完就可以开始对图片进行处理了,包括二值化、灰度化、高斯滤波、降噪等都可实现,此处不再列举事例

2. Tesseract 识别准备工作、环境配置、模型训练

介绍

Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选。而Tess4j则是Tesseract在Java PC上的应用。在英文和数字识别中性能还是不错的,但是在中文识别中,无论速度还是识别率还是较弱,建议有条件的话,针对场景进行训练,会获得较好结果。

先在maven添加依赖

<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.3.1</version></dependency>

2.1 使用官方训练集(省事,但是准确率低)

/tesseract-ocr/tessdata 去官方git下载需要的训练集,(如:eng.traineddata 是英文字符集)下载完成即可开始测试,测试代码

public class test {public static void main(String[] args) throws Exception {// 需要识别的图片String resolve = "D:\\Process.jpg";// 训练集所在的文件夹,不需要精确到文件名String dataPath = "C:\\Users\\me\\Downloads";System.out.println(getImgCode(resolve, dataPath));}public static String getImgCode(String path, String dataPath) {try {// 指定识别图片路径File imageFile = new File(path);BufferedImage img = ImageIO.read(imageFile);Tesseract tessInst = new Tesseract();tessInst.setDatapath(dataPath);tessInst.setLanguage("eng");String result = tessInst.doOCR(img);System.out.println("result:--->" + result);return result;} catch (Exception e) {e.printStackTrace();}return "";}}

对于整齐无干扰的图片识别效果可以,但是一旦有干扰或者不规整,识别结果都一言难尽。因此,我们需要自己训练适合自己的集合来使用。

2.2 自己使用tesseract 训练

2.2.1 准备工作

先点这里去官网下载jTessBoxEditor ,安装,记住自己的安装目录。打开我的电脑右键-> 环境变量->系统环境变量,在path变量处双击,新增一行,值为上一步安装的目录位置,如:D:\Tesseract_OCR。再返回新增变量,名字:TESSDATA_PREFIX,值:{你的安装目录}\tessdata在控制台输入tesseract -v即可查看是否配置成功

2.2.2 使用

Merge样本文件

打开第一步的安装目录,打开jTessBoxEditorFX.jar,工具栏依次打开【Tools】>【Merge TIFF】,如图。打开你的训练图片所在文件夹,

将样本文件全部选上。这里是没有界面化的提示的,选中后,点击【打开】,立马就是输入合成后的文件名界面,输入文件名,如:num.font.exp0.tif。点击【保存】,文件名一定要注意格式,具体如下:

【格式】:[lang].[fontname].exp[num].tif

【说明】:lang为语言名称,fontname为字体名称,num为序号;在tesseract中,一定要注意格式

生成BOX文件

打开 cmd 并切换至上一步tif所在目录。输入下面命令,生成文件名为:num.font.exp0.box的box文件。注意,一定要生成在上一步tif同目录,方便后续操作

tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox

【语法】:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

【语法】:lang为语言名称,fontname为字体名称,num为序号;在tesseract中,一定要注意格式

定义配置文件

在如上目录,新建font_properties.txt,删除后缀。用notepad++ 或者记事本编辑,写入内容:

font 0 0 0 0 0

【语法】:<fontname> <italic> <bold> <fixed> <serif> <fraktur> 【语法】:fontname为字体名称(上步命名的格式中定义好的,保持同步,不要输入错),italic为斜体,bold为黑体字,fixed为默认字体,serif为衬线字体,fraktur德文黑字体,1和0代表有和无,精细区分时可使用

字符矫正

打开 jTessBoxEditor>【BOX Editor】> 【Open】,打开num.font.exp0.tif;矫正【Char】上的字符如图所示,如果有没识别出来的字符,点击菜单栏 —> insert 回车。然后点箭头位置,选中新增字符的框。点击红框位置,调整到该字符对应位置即可,点击 菜单栏 ->save。即可自动覆盖之前的box文件。如有多个box文件,可点击下方的换页符,分别处理。处理结束记得点击保存。

执行批处理文件,生成训练集

【注意】:执行该批处理文件前,先要目录下创建font_properties文件 ,也就是上边定义配置文件那步在目标目录下,新建一个txt文件,复制下方代码,重命名为do.bat

echo Run Tesseract for Training.. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train echo Compute the Character Set.. unicharset_extractor.exe num.font.exp0.box mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr echo Clustering.. cntraining.exe num.font.exp0.tr echo Rename Files.. rename normproto num.normproto rename inttemp num.inttemp rename pffmtable num.pffmtable rename shapetable num.shapetable echo Create Tessdata.. combine_tessdata.exe num. echo. & pause

记得把bat文件中tif文件名、box文件名改成自己的,如图

把生成的.traineddata后缀文件,复制到 Tesseract-OCR 安装目录下的 tessdata 文件夹

测试一下,cmd进入测试图片路径, 输入 如下命令

格式:tesseract {需要识别的图片} {输出文本} -l {训练集名称}

tesseract test1.jpg result -l num

运行结果:

可以看到,经过简单训练后已经可以识别出需要的结果了。如果这个训练的集合够大,那准确率肯定会很高。

如果觉得《【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。