每一个不曾起舞的日子都是对生命的亵渎
--------------------------------------------
看到网上有很多,参考了以下,如果在过程中出现问题,可以一起讨论学习一下,共同进步
别人的项目中使用的比较多,比如识别图片验证码等,
所以我自己百度了下,看见有个不错的demo,我就这这里贴出来了供大家学习参考,
前提条件,idea,maven ,网络 ,安装tesseract
安装tesseract
自己下载也可以,找我要我也给,注意安装的时候注意安装语言包
安装流程,
这一步注意,一般也不需要太多的语言,默认是英语eng,像我这样的一般就是中文简体chi_sim,会多种语言的请出去
2.中文语言包
中文的一般在安装的时候不太容易下载下来,管我要我也给,不跟我要自己下载也可以,但是注意版本的chi_sim.traineddata
将下载下来的chi_sim.traineddata放在安装的path+//tessdata下
3.安装完成后需要配置以下环境变量
记住你自己的安装位置比如我:D:\finally_app\OCR\Tesseract-OCR
像这种的直接在path里添加你的安装位置就可以了,如果系统版本是win7的
注意配置环境变量的时候注意携带最后的 “;”
4.测试安装有没有问题
打开CMD执行tesseract -v 出现以下内容表示正常
常用
tesseract --list-langs 查看支持的语言
tesseract image.png result 开始识别image图片的内容(默认英文)
tesseract imgae.png result -l chi_sim 使用中文识别图片的内容
会在图片的同级目录中生成result.txt,点开查看生成的内容
开始尝试
在图片的目录下打开cmd,输入tesseract imagee.png result
出现以下内容表示识别正常
success
开始用java代码进行识别
2.1、引入pom文件
<dependency> <groupId>net.java.dev.jnagroupId> <artifactId>jnaartifactId> <version>4.1.0version> dependency> <dependency> <groupId>net.sourceforge.tess4jgroupId> <artifactId>tess4jartifactId> <version>4.5.1version> <exclusions> <exclusion> <groupId>com.sun.jnagroupId> <artifactId>jnaartifactId> exclusion> exclusions> dependency>
2.2、编写OCRUtils工具类(循环识别,指定识别)
package com.cn.minsheng.utils;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 OCRUtils { // 设置使用指定语言命令 private final String LANG_OPTION = "-l"; // 获取当前系统的换行符 private final String EOL = System.getProperty("line.separator"); // Tesseract-OCR的安装路径 private String tessPath = "D:\\finally_app\\OCR\\Tesseract-OCR"; /** * @param imageFile : 传入的图像文件 * @return 识别后的字符串 */ public String recognizeText(File imageFile) throws Exception { /** * 设置输出文件的保存的文件目录 * 与当前图片在同一目录下 * getParentFile : 获取当前文件的父目录 */ File outputFile = new File(imageFile.getParentFile(), "output"); // 缓冲流,用于向输出文件写入识别后的数据 StringBuffer strB = new StringBuffer(); // 存储cmd命令 // 注意:不识别空格 // 如 -psm 6要写成cmd.add("-psm"),cmd.add("6") List cmd = new ArrayList<>(); // 调用tesseract指令 cmd.add(tessPath + "\\tesseract"); cmd.add(""); // 输出文件名称 cmd.add(outputFile.getName()); // 指定识别类型 cmd.add("-psm"); // 6表示识别一行字符串 cmd.add("6"); // 使用指定语言包识别 cmd.add(LANG_OPTION); // 使用英文语言包// cmd.add("eng"); // 使用中文识别包 cmd.add("chi_sim"); ProcessBuilder pb = new ProcessBuilder(); /** *Sets this process builder's working directory. */ // 调用cmd命令相关代码 pb.directory(imageFile.getParentFile()); cmd.set(1, 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,效果一致 // Runtime.getRuntime().exec("tesseract.exe 1.jpg 1 -l chi_sim"); /** * the exit value of the process. By convention, 0 indicates normal * termination. */ int w = process.waitFor(); if (w == 0)// 0代表正常退出 { BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(outputFile.getAbsolutePath() + ".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.getAbsolutePath() + ".txt").delete(); // 返回识别后的结果 return strB.toString().replaceAll("\\s*", ""); } }
2.3、编写测试类
package com.cn.minsheng.controller;import java.io.File;import com.cn.minsheng.utils.*; public class HelloWorld { public static void main(String[] args) { //循环OCR识别图片内容// testMultiple();// 指定图片进行OCR识别 testSingle(); } /** * 识别整个文件夹内的图片 * */ public static void testMultiple(){ try { // 文件目录下所有的文件 File testDataDir = new File("D:\\test"); // 遍历获取目录下的每一个文件 for (File file : testDataDir.listFiles()) { // 调用识别方法,获取识别后的字符串 String recognizeText = new OCRUtils().recognizeText(file); // 输出识别后的结果 System.out.println(recognizeText); } } catch (Exception e) { e.printStackTrace(); } } /** * 识别指定图片 * */ public static void testSingle() { try { // 获取指定图片的识别结果 String recognizeText = new OCRUtils().recognizeText(new File("D:\\test\\image.png")); // 输出识别后的结果 System.out.print(recognizeText); } catch (Exception e) { e.printStackTrace(); } } }
中文识别上正确率不是很高,但是如果知识识别一个验证码或者什么的都是足够的,后期还可以通过训练更新训练库进行完善