360SDN.COM

JAVA调用tesseract 识别图片应用二

来源:  2017-06-13 14:02:01    评论:0点击:

来源:http://blog.csdn.net/wangyongxia921/article/details/52813453
上篇博客中简单介绍了 tesseract软件的单独使用,这篇博客介绍如何在java程序中使用 tesseract来实现图像的识别。
博客中主要使用对验证的识别,包含:数字,字母,汉字。
 
在JAVA中调用tesseract,主要有两种方式:cmd方式,tess4j方式。

一、CMD调用tesseract

cmd的方式,就是通过在java中调用命令行,来执行tesseract,其原理比较简单,根据上篇博客中可知tesseract的识别步骤是:
  1. public String getCaptureText() {  
  2.         String result = "";  
  3.         String imgPath=“d:\\Image\\test.jpg";  
  4.         BufferedReader bufReader = null;  
  5.         try {  
  6.             String outPath = imgPath.substring(0, imgPath.lastIndexOf("."));  
  7.             Runtime runtime = Runtime.getRuntime();  
  8.             String command = ocrCommand + " " +  imgPath + " " + outPath +" "+ ocrLangData;  
  9.             Process ps = runtime.exec(command);  
  10.             ps.waitFor();  
  11.             // 读取文件  
  12.             File file = new File(outPath + ".txt");  
  13.             bufReader = new BufferedReader(new FileReader(file));  
  14.             String temp = "";  
  15.             StringBuffer sb = new StringBuffer();  
  16.             while ((temp = bufReader.readLine()) != null) {  
  17.                 sb.append(temp);  
  18.             }  
  19.             // 文字结果  
  20.             result = sb.toString();  
  21.             if (StringUtils.isNotBlank(result))  
  22.                 result = result.replaceAll(" """);  
  23.         } catch (Exception e) {  
  24.             logger.error("识别验证码异常,Exception:{}", e.getMessage());  
  25.             e.printStackTrace();  
  26.         }  
  27.         return result;  
  28.     }  

 

二、tess4j方式

 
官方解释:A Java JNA wrapper for Tesseract OCR API.也就是说:tess4j是针对tesseract进行封装的javaAPI。通过Tess4j来操作

2.1依赖

因为tess4j依赖jna,而新版的tess4j和默认的com.sun.jna 3.0.6版本不兼容,它需要先加入groupID为:net.java.dev.jna 这个jna的依赖,然后加入tess4j的依赖(exclude掉默认的jna),如下:
  1. <dependency>  
  2.             <groupId>net.java.dev.jna</groupId>  
  3.             <artifactId>jna</artifactId>  
  4.             <version>4.1.0</version>  
  5.         </dependency>  
  6.         <dependency>  
  7.             <groupId>net.sourceforge.tess4j</groupId>  
  8.             <artifactId>tess4j</artifactId>  
  9.             <version>2.0.1</version>  
  10.             <exclusions>  
  11.                 <exclusion>  
  12.                     <groupId>com.sun.jna</groupId>  
  13.                     <artifactId>jna</artifactId>  
  14.                 </exclusion>  
  15.             </exclusions>  
  16.         </dependency>  
依赖库就只有这些,不需要安装tessreact-ocr,因为新版tess4j的jar包里面自带了。

2.2 语言包

选择一个目录,增加语言包文件夹:tessdata.然后把需要的语言包加入到tessdata目录下:chi_sim.traineddata.eng.traineddata等。

2.3 代码调用

  1. public static void main(String[] args){  
  2.        File imageFile = new File("D:\\ImageCapture\\test.jpg");  
  3.        ITesseract instance = new Tesseract();       
  4.        instance.setDatapath"D:\\Program Files(x86)\\tessdata");  
  5.        // 默认是英文(识别字母和数字),如果要识别中文(数字 + 中文),需要制定语言包  
  6.        instance.setLanguage("chi_sim");  
  7.        try{  
  8.            String result = instance.doOCR(imageFile);  
  9.            System.out.println(result);  
  10.        }catch(TesseractException e){  
  11.            System.out.println(e.getMessage());  
  12.        }  
  13.    }  
这个demo中,语言包,我们使用的是跟项目无关的一个绝对路径,这样跟我们的项目不在一起,服务器变动的时候,还需要改动这个文件,容易被落下,所以我们最好是把语言包放到项目的资源文件中,下面这个例子中改成使用项目的资源文件。
 
  1. public static void main(String[] args){  
  2.         File imageFile = new File("D:\\ImageCapture\\test.jpg");  
  3.         ITesseract instance = new Tesseract();  
  4.         URL url = ClassLoader.getSystemResource("tessdata");  
  5.         String path = url.getPath().substring(1);  
  6.         instance.setDatapath(path);  
  7.         // 默认是英文(识别字母和数字),如果要识别中文(数字 + 中文),需要制定语言包  
  8.         instance.setLanguage("chi_sim");  
  9.         try{  
  10.             String result = instance.doOCR(imageFile);  
  11.             System.out.println(result);  
  12.         }catch(TesseractException e){  
  13.             System.out.println(e.getMessage());  
  14.         }  
  15.     }  

三、总结

    1、cmd的方式:
              需要安装tesseract软件,就是通过在程序中调用命令行来进行tesseract的操作。
              不足:在使用的服务器上,都需要进行tesseract的安装。
                         识别图片之后的结果文件都存在服务器上,需要定期进行处理。
    2、tess4j的方式:
                   不需要安装tesseract软件,通过依赖引入JAR,就可以了。而tess4j下也封装了图片处理的工具类:如缩放,旋转等,基本都包含这些功能。
   个人还是比较推荐使用tess4j方式的。因为在测试过程中,有的图片使用cmd没有识别出来,但是使用tess4j就识别出来了。
为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权