==========================================================================================================

写在前面:

这两天比较头疼这个验证码识别功能,本来查看相关的资料时候,tesseract已经能够完成基本的识别,识别效果差,加上还有其他其他exe,后来

在网上看到Tess4J的文字,然后就想着该用这种依赖jar包融合的方式进行识别,下来列举下自己在OCR识别图片过程中遇到的坑和解决方案。

==========================================================================================================

参考链接地址:https://blog.csdn.net/zai_xia/article/details/80003778

首先,列举下进行OCR识别的步骤。

(1)下载图片或者截图地址到本地。

(2)对图片进行处理(如降噪,灰度等),根据识别图片的特点。

(3)使用Tess4J进行图片处理,获取识别结果,返回识别文本。

今天,着重讲下第三部分,上一篇实战里已经说了,可以使用Tesseract-ocr方式进行识别,但是由于需要下载软件,安装配置等,个人觉得移植性不高,所以使用Tess4J进行处理。

第一步:下载Tess4J的压缩包等。官网:http://tess4j.sourceforge.net/codesample.html

解压,其中的目录结构如下:

需要用到其中圈起来的三个文件夹中的东西。lib文件夹下放的是需要用到的Jar包,tessdata下放的是语言库,默认的有英语库,中文库需要另外下载,下载地址:https://github.com/tesseract-ocr/tessdata/blob/master/chi_sim.traineddata。

新建一个Java项目,将lib文件夹和tessdata文件夹复制到项目的根目录下,找到dist文件夹下的tess4j.jar(名字可能有版本号),将该文件也复制到项目根目录下的lib文件夹下。

项目的的目录如下:

lib中的文件如下(tess4J.jar也在该目录下):

再在eclipse中打开项目,在项目中导入lib文件夹中所有的jar包(Build path --> configure build path),导入后的结果如下:

这样前期准备工作就完成了,下面就剩下代码了。Tess4J的代码比较简洁,如下:

Tess4JTest.java

package ocr;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.LoadLibs; import java.io.File;
import java.io.IOException; /**
* Tess4J测试类
*/
public class Tess4JTest { public static void main(String[] args){ String path = "D://Java//Tess4J"; //我的项目存放路径 File file = new File(path + "//photo.jpg");
ITesseract instance = new Tesseract(); /**
* 获取项目根路径,例如: D:\IDEAWorkSpace\tess4J
*/
File directory = new File(path);
String courseFile = null;
try {
courseFile = directory.getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
} //设置训练库的位置
instance.setDatapath(courseFile + "//tessdata"); instance.setLanguage("eng");//chi_sim :简体中文, eng 根据需求选择语言库
String result = null;
try {
long startTime = System.currentTimeMillis();
result = instance.doOCR(file);
long endTime = System.currentTimeMillis();
System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
} catch (TesseractException e) {
e.printStackTrace();
} System.out.println("result: ");
System.out.println(result);
} }

通过以上文字介绍的方式,本地化加入Lib包后,能够成功的识别文本,并输出结果。

但是我想把工程文件放到jenkins上去,所以不想额外依赖lib包,希望能够通过其他的方式比如maven的lib方式,加载相关内容。

也查了网络上相关的资料,不知道能不能成功呢。

相关参考链接:https://kefeng.wang/2017/04/22/tess4j/

第一:在maven添加依赖。

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

第二,在代码中添加识别文件的代码:

    /**
* @Title: executeTess4J
* @Description: 执行图片识别
* @param imgUrl
* @param resUrl
* @return void
*/
public static String executeTess4J(String imgUrl) {
String ocrResult = "";
try { File imgDir = new File(imgUrl);
File tess = LoadLibs.extractTessResources("tessdata");
ITesseract instance = new Tesseract();
instance.setLanguage("eng");
// instance.setLanguage("chi_sim");
            // 设置训练库的位置
logger.info("-----TESSDATA_FILE_PATH:" + tess.getParent() + "-----");
instance.setDatapath(tess.getParent());

long startTime = System.currentTimeMillis();
ocrResult = instance.doOCR(imgDir); logger.info("-----识别出的文本内容:" + ocrResult + "-----");
long endTime = System.currentTimeMillis();
logger.info("Time is:" + (endTime - startTime) + " 毫秒");
} catch (TesseractException e) {
e.printStackTrace();
}
return ocrResult;
}

然后浪费我时间比较多的是,在执行

ocrResult = instance.doOCR(imgDir);

的时候,总是会报错,报错内容如下:
报错如下:
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language ‘eng‘
Tesseract couldn‘t load any languages!
Could not initialize tesseract.

然后查找该问题的解决方案中,发现可以设置环境变量

TESSDATA_PREFIX
来解决,可是搞了半天没搞成功。
最后发现ITesseract类中,有个
instance.setDatapath(tess.getParent());
的方法,个人觉得比较实用,就是自己设置tessdata路径,然后让程序读取该路径下的信息。。 入了一个坑就是,使用maven下载的是4.1.1最新的版本,然后调试程序中发现始终打不开eng包,然后定位到相关目录下才发现,可能下载的maven包本身有问题,
然后在使用手动加入lib解决后,现在使用3.5.3版本完毕解决该问题。 但是个人感觉,在OCR过程中还是踩过很多坑,总结下来帮助自己回忆一些问题。
目前的方案虽然不是最完美的,但是能解决问题,一步一步来。

 

【Selenium-WebDriver实战篇】selenium之使用Tess4J进行验证码图片识别内容的更多相关文章

  1. java selenium webdriver实战 seleniumIDE

    Selenium是ThoughtWorks公司,一个名为Jason Huggins的测试为了减少手工测试的工作量,自己实现的一套基于Javascript语言的代码库 使用这套库可以进行页面的交互操作, ...

  2. 《一头扎进》系列之Python+Selenium框架实战篇7 - 年底升职加薪,年终奖全靠它!Merry Christmas

    1. 简介 截止到上一篇文章为止,框架基本完全搭建完成.那么今天我们要做什么呢????聪明如你的小伙伴或者是童鞋一定已经猜到了,都测试完了,当然是要生成一份高端大气上档次的测试报告了.没错的,今天宏哥 ...

  3. [转]java selenium webdriver实战 应用小结

    原文链接:http://www.cnblogs.com/itliucheng/p/5578788.html 部分api 1.访问网站 driver.get("http://www.baidu ...

  4. java selenium webdriver实战 应用小结

    部分api 1.访问网站 driver.get("http://www.baidu.com"); 或者 driver.navigate().to("http://www. ...

  5. java selenium webdriver实战 helloWord

    第一步:建立Maven项目 Selenium 支持 maven 工程,这会让你的工作更加简便. 用 Eclipse 建个 Maven 的工程,建成后,修改 pom.xml <dependenci ...

  6. java selenium webdriver实战 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  7. [selenium webdriver Java]检查元素是否存在

    Selenium WebDriver没有实现Selenium RC的isElementPresent()方法来检查页面上的元素是否存在. 在WebDriver中封装一个类似的方法,如下: public ...

  8. 转载 基于Selenium WebDriver的Web应用自动化测试

    转载原地址:  https://www.ibm.com/developerworks/cn/web/1306_chenlei_webdriver/ 对于 Web 应用,软件测试人员在日常的测试工作中, ...

  9. 【转载】Selenium WebDriver的简单操作说明

    转载自:http://blog.csdn.net/xiao190128/article/details/49784121 1.打开一个测试浏览器 对浏览器进行操作首先需要打开一个浏览器,接下来才能对浏 ...

随机推荐

  1. 【转帖】Linux命令行操作json神器jq

    Linux命令行操作json神器jq https://www.cnblogs.com/chenqionghe/p/11736942.html jq类似一个awk或grep一样的神器,可以方便地在命令行 ...

  2. [转帖]POW , POS 与 DPOS 一切都为了共识

    POW , POS 与 DPOS 一切都为了共识 https://www.jianshu.com/p/f99e8fe57c9a   共识机制的背景 加密货币都是去中心化的,去中心化的基础就是P2P节点 ...

  3. Delphi TButton.OnClick 匿名函数用法

    type TNotifyEventRef = reference to procedure(Sender: TObject); function AnonymousEvent(const Proc: ...

  4. 网格搜索与K近邻中更多的超参数

    目录 网格搜索与K近邻中更多的超参数 一.knn网格搜索超参寻优 二.更多距离的定义 1.向量空间余弦相似度 2.调整余弦相似度 3.皮尔森相关系数 4.杰卡德相似系数 网格搜索与K近邻中更多的超参数 ...

  5. PV、UV、UIP、VV、DAU、CTR指的是什么?

    PV(page view) 网站浏览量,指网页的浏览次数,用户每打开一次页面就记录一次PV,多次打开则累加. UV(unique vistor) 独立访客数,指的是某一天访问某站点的人数,以cooki ...

  6. 转!!通俗理解数字加密,数字签名,数字证书和https

    原博文地址:https://www.jianshu.com/p/4932cb1499bf 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应. ...

  7. 30个关于Shell脚本的经典案例(下)

    本文目录 21.从FTP服务器下载文件 22.连续输入5个100以内的数字,统计和.最小和最大 23.将结果分别赋值给变量 24.批量修改文件名 25.统计当前目录中以.html结尾的文件总大 26. ...

  8. pandas-01 Series()的几种创建方法

    pandas-01 Series()的几种创建方法 pandas.Series()的几种创建方法. import numpy as np import pandas as pd # 使用一个列表生成一 ...

  9. JavaScript之定时器

    (1)单次定时器 setTimeout(function(){执行的动作},时间:ms) 单次定时器,一般用于函数节流 案例: var timer=setTimeout(function(){ doc ...

  10. jetbrains全家桶激活

    56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2DIC4iLCJhc3NpZ25lZ ...