在JAVA中调用tesseract识别图片的文字内容,主要有两种方式:cmd方式,tess4j方式。在这篇博客中,主要记录一下通过cmd命令行的方式。cmd方式,就是通过在java中调用命令行,来执行tesseract,它的原理就是上篇博客所写的内容。

步骤:

(1)导入两个jar包:jai_imageio-1.1.1.jar 和 swingx-1.6.1.jar

(2)编写ImageIOHelper类,用于创建临时图片文件,防止损坏初始文件

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Locale;import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
/**
* 类说明 :创建临时图片文件防止损坏初始文件
*/
public class ImageIOHelper {//设置语言private Locale locale=Locale.CHINESE;//自定义语言构造的方法public ImageIOHelper(Locale locale){this.locale=locale;}//默认构造器Locale.CHINESEpublic ImageIOHelper(){}/*** 创建临时图片文件防止损坏初始文件* @param imageFile* @param imageFormat like png,jps .etc* @return TempFile of Image*/public File createImage(File imageFile, String imageFormat) throws IOException {//读取图片文件Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);    ImageReader reader = readers.next();//获取文件流ImageInputStream iis = ImageIO.createImageInputStream(imageFile);reader.setInput(iis);IIOMetadata streamMetadata = reader.getStreamMetadata();   //设置writeParamTIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);    tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED); //设置可否压缩 //获得tiffWriter和设置outputIterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");    ImageWriter writer = writers.next();    BufferedImage bi = reader.read(0);    IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));    File tempFile = tempImageFile(imageFile);    ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);    writer.setOutput(ios);    writer.write(streamMetadata, image, tiffWriteParam); ios.close();iis.close();writer.dispose();    reader.dispose();    return tempFile;    }    /*** 给tempfile添加后缀* @param imageFile* @throws IOException */private File tempImageFile(File imageFile) throws IOException {    String path = imageFile.getPath();    StringBuffer strB = new StringBuffer(path);    strB.insert(path.lastIndexOf('.'),"_text_recognize_temp");String s=strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");Runtime.getRuntime().exec("attrib "+"\""+s+"\""+" +H"); //设置文件隐藏return new File(strB.toString()); }
}

(3)创建OCRUtil工具类,用于进行图片文字识别:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;import org.jdesktop.swingx.util.OS;/**
* 类说明:OCR工具类
*/
public class OCRUtil {private final String LANG_OPTION = "-l";  //英文字母小写l,并非阿拉伯数字1    private final String EOL = System.getProperty("line.separator");    private String tessPath = "D://Tesseract//Tsseract-OCR//Tesseract-OCR";//ocr的安装路径public OCRUtil(String tessPath,String transFileName){this.tessPath=tessPath;}//OCRUtil的构造方法,默认路径是"C://Program Files (x86)//Tesseract-OCR"public OCRUtil(){     }public String getTessPath() {return tessPath;}public void setTessPath(String tessPath) {this.tessPath = tessPath;}public String getLANG_OPTION() {return LANG_OPTION;}public String getEOL() {return EOL;}/*** @param 需要识别的文件* @param 文件的格式* @return 识别后的文字*/public String recognizeText(File imageFile,String imageFormat)throws Exception{    File tempImage = new ImageIOHelper().createImage(imageFile,imageFormat);    return ocrImages(tempImage, imageFile);   }    //可以自定义语言public String recognizeText(File imageFile,String imageFormat,Locale locale)throws Exception{    File tempImage = new ImageIOHelper(locale).createImage(imageFile,imageFormat);return ocrImages(tempImage, imageFile);}/*** @param 临时文件* @param 需要识别的文件* @return 识别后的内容* @throws IOException* @throws InterruptedException*/private String ocrImages(File tempImage,File imageFile) throws IOException, InterruptedException{//设置输出文件的保存的文件目录,以及文件名File outputFile = new File(imageFile.getParentFile(),"test");StringBuffer strB = new StringBuffer();  //设置命令行内容List<String> cmd = new ArrayList<String>();    if(OS.isWindowsXP()){    cmd.add(tessPath+"//tesseract");    }else if(OS.isLinux()){    cmd.add("tesseract");    }else{    cmd.add(tessPath+"//tesseract");    }    cmd.add("");    cmd.add(outputFile.getName());    cmd.add(LANG_OPTION);    cmd.add("chi_sim");//中文包cmd.add("equ");//常用数学公式包cmd.add("eng");//英语包//创建操作系统进程ProcessBuilder pb = new ProcessBuilder();    pb.directory(imageFile.getParentFile());//设置此进程生成器的工作目录   cmd.set(1, tempImage.getName());    pb.command(cmd);//设置要执行的cmd命令 pb.redirectErrorStream(true);//设置后续子进程生成的错误输出都将与标准输出合并   long startTime = System.currentTimeMillis();System.out.println("开始时间:" + startTime);Process process = pb.start();//开始执行,并返回进程实例 //最终执行命令为:tesseract 1.png test -l chi_sim+equ+engint w = process.waitFor();    tempImage.delete();//删除临时正在工作文件         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 recongnize the image or its selected region.";    break;    case 31:    msg = "Unsupported image format.";    break;    default:    msg = "Errors occurred.";    }    tempImage.delete();    throw new RuntimeException(msg);    }    new File(outputFile.getAbsolutePath()+".txt");//.delete();    return strB.toString().replaceAll("\\s*", ""); }
}

(4)创建测试类Test:

import java.io.File;
import java.io.IOException;/**
* @version 创建时间:2018年4月25日 下午5:09:19
* 类说明:测试类
*/
public class Test {public static void main(String[] args) {try {//图片文件:此图片是需要被识别的图片路径 File file = new File("C://Users//1_20180208150251_x4hzz//1.png");//String recognizeText = new OCRHelper().recognizeText(file);String recognizeText = new OCRUtil().recognizeText(file, "png");System.out.print(recognizeText + "\t");} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
}

至此,只要传入需要识别的图片,就可以识别出图片中的文字的内容了。

图像文字识别(二):java调用tesseract 识别图片文字相关推荐

  1. Java使用Tesseract-OCR文字识别(Java调用tess4j提取图片中文、英文、数字信息)

    由于需要在应用中将原本的身份认证手动提交身份信息改为用户上传身份证照自动提取信息,提升用户体验,第一时间想到阿里云等平台的收费服务及开源技术Tesseract-OCR(Tesseract-OCR提供了 ...

  2. Python识别验证码,基于Tesseract实现图片文字识别

    一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...

  3. java 图片识别 tess4j_图像文字识别(四):java调用tess4j识别图像文字

    转自:https://blog.csdn.net/a745233700/article/details/80203340java java调用tess4j识别图像文字 Tesseract-OCR支持中 ...

  4. 使用百度云识别图片中的文字(二):获取图片中的文字

    使用百度云识别图片中的文字(二):获取图片中的文字 上一篇文章中提到怎样获取access_token.此篇文章就是通过access_token来识别图片中的文字. 先来看看:官方的介绍吧: 本文档主要 ...

  5. Java调用opencv实现图片去水印

    opencv实现图片去水印案例 Java调用opencv实现图片去水印 环境安装配置 IDEA下开发配置 测试案例 Java调用opencv实现图片去水印 最近项目中遇到个需求,图片去水印下载,由于上 ...

  6. 图片文字提取,清华图片文字提取工具,wrod怎么提取图片文字,怎么把图片里面的文字提取?

    在学习工作生活中,我们会遇到一些只能查看却无法下载的文档,如果想要使用里面的文本内容怎么办,我们只能一边看文档一边打字,但是这样的效率太低了.有没有其他的好的方式呢?比如将文档拍照或者干脆截图,再把图 ...

  7. java调用ocr识别api_Java文字识别软件-调用百度ocr实现文字识别

    java_baidu_ocr Java调用百度OCR文字识别API实现图片文字识别软件 项目源代码在文末,放到了GitHub上 - https://github.com/Ymy214/java_bai ...

  8. Java 使用开源类库 Tesseract 实现图片文字识别

    Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选.Tess4J则是Tesseract在Java上的应用.Tess4J的官网地址为:http://tess4j ...

  9. 3测试图片显示置信度_告别腾讯百度图片文字识别API调用,OCR图片文字识别就用这条代码...

    上期文章我们分享了tesseract的基本安装,本期我们来分享一下如何使用python与tesseract进行代码的编程来实现tesseract的文字识别 在开始本期文章之前,请认真阅读一下小编前期分 ...

最新文章

  1. 如何在使用新技术前评估其浏览器兼容性
  2. Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件
  3. php离线自动执行,离线执行php任务
  4. mysql batis传多个参数_Mybatis传多个参数(三种解决方案)
  5. mysql uroot p 报错,MySQL链接错误集。
  6. Rime中州韵导入QQ五笔词库
  7. 激光雷达三维检测包含哪些内容?
  8. 【pys60笔记】中文
  9. IPtables中SNAT、DNAT和MASQUERADE的含义 (转)
  10. OpenAI 开源语音识别 Whisper
  11. 关于travis scott的网名_【游戏网名】微信情侣名字情侣专用2020 霸气秀恩爱的情侣网名...
  12. Python学习小组课程P2-Python基础(2)文件操作
  13. saltstack return mysql_10-saltstack 数据返回到MySQL
  14. 一文带你走进CI/CD
  15. python中cfg_python操作cfg配置文件
  16. 全能成熟稳定开源分布式存储Ceph破冰之旅-上
  17. 固化EOS智能合约,监管升级权限,净化EOS DAPP生态
  18. android studio开发环境搭建,国内服务器代理下载android sdk
  19. MATLAB中的*(乘)和.*(点乘)傻傻分不清?!
  20. 【计算方法】实验一:python使用二分法、不动点法、牛顿法求根

热门文章

  1. 四十、Vue项目上手 | 用户管理系统 实现弹窗,搜索和详细页功能(下篇)
  2. 化学反应工程 第一章 均相单一反应动力学和理想反应器
  3. leetcode 刷题140 141
  4. 生成对抗网络(GAN)的统计推断
  5. 多样性文本生成任务的研究进展
  6. 工业界推荐系统必读论文:基于深度学习的推荐模型——DLRM
  7. 论文解读 | 基于神经网络的知识推理
  8. 直播实录 | 基于生成模型的事件流研究 + NIPS 2017 论文解读
  9. java3.3-3.6类与对象2020.3.13
  10. ups容量计算和配置方法_干货:UPS电源配蓄电池公式计算方法!