opencv+tesseract实现验证码识别的示例

作者:peng_wei_kang 时间:2021-02-21 04:20:44 

一、需要识别的内容

需要识别的验证码内容如下  验证码下载下载地址。

opencv+tesseract实现验证码识别的示例

二、直接调用tesseract来完成识别(识别率很差)

识别的图片内容为:opencv+tesseract实现验证码识别的示例

在window系统钟打开cmd命令窗口,执行识别命令如下:

tesseract.exe 01.png output.txt -l eng

识别结果为:519}       该识别准确率远远达不到预期

三、训练数据样本,提升识别率

1、下载10份样本(样本数量越多,识别率越高),然后通过jTessBoxEditor来进行样本数据矫正(该步骤耗时较长)。

opencv+tesseract实现验证码识别的示例

 2、打开 jTessBoxEditor,将所有的样本数据生成一个总的tif文件(tif就是所有图片的集合)。操作如下:

1)jTessBoxEditor->Tools->Merge TIFF

opencv+tesseract实现验证码识别的示例

2 )全选所有的样本文件,之后生成的tif命名为 jtbnum.font.exp0.tif

opencv+tesseract实现验证码识别的示例

opencv+tesseract实现验证码识别的示例

3)进行数据识别调整,如下图:

opencv+tesseract实现验证码识别的示例

opencv+tesseract实现验证码识别的示例

 四、生成样本库字体

将所有的样本识别内容都调整正确后(调整的参数保存在jtbnum.font.exp0.box文件钟),我们需要将我们生成的样本文件封装成我们的 jtbnum.traineddata 字体库,生成方式如下:

1)创建 font_properties 文件,内容为 font 0 0 0 0 0

2)在同级目录创建 run.bat 文件 内容如下

rem 执行改批处理前先要目录下创建font_properties文件  

echo Run Tesseract for Training..  
tesseract.exe jtbnum.font.exp0.tif jtbnum.font.exp0 nobatch box.train  

echo Compute the Character Set..  
unicharset_extractor.exe jtbnum.font.exp0.box  
mftraining -F font_properties -U unicharset -O jtbnum.unicharset jtbnum.font.exp0.tr  

echo Clustering..  
cntraining.exe jtbnum.font.exp0.tr  

echo Rename Files..  

del jtbnum.normproto
rename normproto jtbnum.normproto

del jtbnum.inttemp
rename inttemp jtbnum.inttemp

del jtbnum.pffmtable
rename pffmtable jtbnum.pffmtable

del jtbnum.shapetable
rename shapetable jtbnum.shapetable

echo Create Tessdata..  
combine_tessdata.exe jtbnum.

pause

 3)双击执行 run.bat 文件,系统执行完成后,将会生成 jtbnum.traineddata 文件。

4)将 jtbnum.traineddata 拷贝到tesseract安装目录下的tessdata文件夹下。

5)测试识别率:

 识别的图片内容为:opencv+tesseract实现验证码识别的示例

tesseract.exe 01.png output.txt -l jtbnum

 识别结果为:51915       识别结果已经很准确率,但是验证码图片中的杂质没有清除,导致会识别出多余内容来。

五、通过Opencv清除图片的多余杂质(Java实现)

if(!hasLoad){
           System.load(opencvPath+"/build/java/x64/opencv_java440.dll");
           hasLoad = true;
       }

byte [] bytes = Base64Utils.decodeFromString(base64);
       String path = savePath+"/"+System.currentTimeMillis()+".png";
       try {
           OutputStream outputStream = new FileOutputStream(new File(path));
           outputStream.write(bytes);
           outputStream.flush();
           outputStream.close();
       } catch (Exception e) {
           e.printStackTrace();
       }

Mat image0 = Imgcodecs.imread(path);
       Mat image1 = new Mat();
       //灰度处理
       Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);
       Imgproc.adaptiveThreshold(image1,image1,255,Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY,11, 2);
       Core.bitwise_not(image1,image1);
       Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2), new Point(-1, -1));
       Mat temp = new Mat();
       Imgproc.erode(image1, temp, kernel);
       Imgproc.dilate(temp, temp, kernel);
       String newPath = path.substring(0,path.lastIndexOf(".")) +"_1.png";
       Imgcodecs.imwrite(newPath,temp);

图片处理结果如下(杂质已经清除):

opencv+tesseract实现验证码识别的示例

5)测试识别率:

 识别的图片内容为:opencv+tesseract实现验证码识别的示例

tesseract.exe 01.png output.txt -l jtbnum

 识别结果为:5191       识别已经很精确

来源:https://blog.csdn.net/peng_wei_kang/article/details/125482305

标签:opencv,tesseract,验证码识别
0
投稿

猜你喜欢

  • 一些 T-SQL 技巧

    2024-01-26 00:21:16
  • Pytorch中如何调用forward()函数

    2023-06-14 21:00:24
  • 解决Jupyter因卸载重装导致的问题修复

    2023-09-30 18:22:31
  • JavaScript中的this指向问题详解

    2024-04-28 09:46:58
  • Golang空接口与类型断言的实现

    2024-04-27 15:39:21
  • PyQt QCombobox设置行高的方法

    2021-10-15 19:50:20
  • python装饰器相当于函数的调用方式

    2021-05-13 13:39:03
  • Python3安装Pymongo详细步骤

    2021-06-09 10:27:20
  • python实现写数字文件名的递增保存文件方法

    2022-10-18 18:50:50
  • 基于PyQt5制作一个PDF文件合并器

    2023-04-27 07:50:58
  • Python实现简单截取中文字符串的方法

    2022-09-08 01:43:48
  • python中使用paramiko模块并实现远程连接服务器执行上传下载功能

    2021-03-29 07:00:56
  • numpy系列之数组重塑的实现

    2022-10-20 13:36:35
  • Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    2023-07-29 00:03:51
  • JS遮罩层效果 兼容ie firefox jQuery遮罩层

    2024-02-24 23:04:24
  • 基于JS实现简单滑块拼图游戏

    2024-04-17 09:52:33
  • PHP依赖注入原理与用法分析

    2023-09-04 01:22:54
  • Python通过tkinter实现百度搜索的示例代码

    2022-06-28 01:28:46
  • PHP判断密码强度的方法详解

    2023-06-14 03:00:08
  • 全兼容可高亮二级缓冲折叠菜单

    2010-06-03 16:53:00
  • asp之家 网络编程 m.aspxhome.com