Tesseract-OCR安装使用,通过java结合使用
随着人工智能的发展,生活中也逐渐出现了很多便捷高效的应用,人脸识别、证件识别认证、名片识别、车牌识别等,都在方便着我们的日常生活。同样,这些技术也可以为我们的日常业务处理流程提供智能高效的解决方案。日常交易、清算业务往来存在各种电子邮件、传真等单据,主要有确认成交单据、定存协议、对敲指令、银行间费用、网下中签公告、境外券商确认单等。这些单据需要人工识别提取要素录入系统,通过使用OCR技术,对单据图像内容进行识别、矫正,提取关键字段元素,与相关系统连接,能够减少人工手动录入,提高工作效率,降低人工录入失误。
光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。通常,图像信息通过扫描仪、照相机、电子传真软件等设备获取并存储在图像文件中,然后OCR软件读取、分析图像文件并通过字符识别提取出其中的字符串。
简单介绍到这里,开始本文的重点
Tesseract-OCR安装
Tesseract-OCR下载地址:https://github.com/UB-Mannheim/tesseract/wiki,下载tesseract安装包,我下载的4.0的Tesseract版本。
安装tesseract
1、双击tesseract-ocr-setup-4.0.0-alpha.20170804.exe运行
2、点击next
3、点击我同意,点击next
4、点击next
5、点击next
6、点击next,这地方我是默认安装位置
7、点击install,到这就开始安装了
8、点击next,到这就安装结束了
配置tesseract环境变量
此电脑–>右键–>点击属性–>高级系统设置
环境变量
系统环境变量–>path,添加Tesseract-OCR的路径位置
系统变量–>新建
变量名:TESSDATA_PREFIX
变量值:C:\Program Files (x86)\Tesseract-OCR\tessdata
你Tesseract安装的位置我是默认的安装位置
这一步是添加Tesseract-OCR的语言库,语言库地址:https://github.com/tesseract-ocr/tessdata。你还可以根据实际情况去自己训练自己的语言
最后点击确定,应用到这里就环境变量就配置好了。
测试
- cmd打开dos窗口。
tesseract -v
这一步就算安装成功了 - 使用
先准备一张图片文件,如test.png
运行tesseract test.png 1 -l eng
发现会多一个1.txt文本,然后打开看一下就可以发现就是验证的文本
如下所示:
Tesseract-ORC与java代码结合
不需要引入依赖之类的
创建OCRHelper帮助类
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class OCRHelper {
private final String LANG_OPTION = "-l";
private final String EOL = System.getProperty("line.separator");
/**
* Tesseract-OCR的安装路径
*/
private String tessPath = "C:\\Program Files (x86)\\Tesseract-OCR";
/**
* @param imageFile 传入的图像文
* @return 识别后的字符串
*/
public String recognizeText(File imageFile) throws Exception {
/**
* 设置输出文件的保存的文件目录,创建output文件夹
*/
File outputFile = new File(imageFile.getParentFile(), "output");
StringBuffer strB = new StringBuffer();
List<String> cmd = new ArrayList<String>();
cmd.add(tessPath + "\\tesseract");
cmd.add("");
cmd.add(outputFile+"\\"+outputFile.getName());
cmd.add(LANG_OPTION);
// cmd.add("chi_sim");// 切换中文识别语言或者你自己训练的语言
cmd.add("eng");
ProcessBuilder pb = new ProcessBuilder();
pb.directory(new File(tessPath));
cmd.set(1, imageFile.getParentFile()+"\\"+imageFile.getName());
pb.command(cmd);
pb.redirectErrorStream(true);
long startTime = System.currentTimeMillis();
System.out.println("开始时间:" + startTime);
Process process = pb.start();/**/
// tesseract.exe 1.jpg 1 -l chi_sim
//不习惯使用ProcessBuilder的,也可以使用Runtime,效果一致
// System.out.println(imageFile.getName());
// System.out.println(imageFile.getParentFile());
// Process exec = Runtime.getRuntime().exec(tessPath+"\\"+"tesseract.exe " + imageFile.getParentFile()+"\\"+imageFile.getName() + " 1 -l eng");
/**
* the exit value of the process. By convention, 0 indicates normal
* termination.
*/
int w = process.waitFor();
// int w = exec.waitFor();
if (w == 0)// 0代表正常退出
{
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(outputFile+"\\"+outputFile.getName()+".txt"),
"UTF-8"));
String str;
while ((str = in.readLine()) != null) {
strB.append(str).append(EOL);
}
in.close();
long endTime = System.currentTimeMillis();
System.out.println("结束时间:" + endTime);
System.out.println("耗时:" + (endTime - startTime) + "毫秒");
} else {
String msg;
switch (w) {
case 1:
msg = "Errors accessing files. There may be spaces in your image's filename.";
break;
case 29:
msg = "Cannot recognize the image or its selected region.";
break;
case 31:
msg = "Unsupported image format.";
break;
default:
msg = "Errors occurred.";
}
throw new RuntimeException(msg);
}
// 删除生成的文件
new File(outputFile+"\\"+outputFile.getName()+".txt").delete();
return strB.toString().replaceAll("\\s*", "");
}
}
主入口类来运行
import java.io.File;
import java.io.IOException;
public class TestOCR {
public static void main(String[] args) {
try {
//图片文件:此图片是需要被识别的图片
File file = new File("E:\\vscode\\canvas\\img\\test.png");
/*String recognizeText = new OCRHelper().recognizeText(file);
System.out.print(recognizeText + "\t");*/
System.out.println("begin.........");
String recognizeText1 = new OCRHelper().recognizeText(file);
System.out.print(recognizeText1+"\t");
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后运行结果如下:
是不是很简单。与java结合代码就这么多,是不是很so easy。实际操作中会遇到很多奇奇怪怪的实际开发问题,所以咱们针对专门的需求,需要训练自己需要的一个语言库,以提高识别率,还有比如图片去二值化、去除图片干扰线,灰度化等针对图片,来提图片高识别率。
比如我遇到爬虫爬取数据,登录就有验证码,但客户就要这个网站的数据,怎么办破解呗,咱把图片验证码识别出来不就可以了。登录获取到cookie然后再爬取。
如何提高验证码识别率?下篇博客讲吧,这一篇已经不少,我怕没耐心看完(●’◡’●),不是故意写两篇的