java文字识别程序的关键是寻找一个可以调用的OCR引擎。tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google。tesseract-ocr 3.0发布,支持中文。不过tesseract-ocr 3.0不是图形化界面的客户端,别人写的FreeOCR图形化客户端还不支持导入新的 3.0 traineddata。但这标志着,现在有自由的中文OCR软件了。

java中使用tesseract-ocr3.01的步骤如下:

1.下载安装tesseract-ocr-setup-3.01-1.exe(3.0以上版本才增加了中文识别)

2.在安装向导中可以选择需要下载的语言包。

3.到网上搜索下载java图形处理所需的2个包:jai_imageio-1.1-alpha.jar,swingx-1.6.1.jar

4.java程序清单:

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 { 

  public static File createImage(File imageFile, String imageFormat) {
   File tempFile = null;
   try {
    Iterator readers = ImageIO.getImageReadersByFormatName(imageFormat);
    ImageReader reader = readers.next(); 

    ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
    reader.setInput(iis);
    //Read the stream metadata
    IIOMetadata streamMetadata = reader.getStreamMetadata(); 

    //Set up the writeParam
    TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
    tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED); 

    //Get tif writer and set output to file
    Iterator writers = ImageIO.getImageWritersByFormatName("tiff");
    ImageWriter writer = writers.next(); 

    BufferedImage bi = reader.read(0);
    IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
    tempFile = tempImageFile(imageFile);
    ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
    writer.setOutput(ios);
    writer.write(streamMetadata, image, tiffWriteParam);
    ios.close(); 

    writer.dispose();
    reader.dispose(); 

   } catch (IOException e) {
    e.printStackTrace();
   }
   return tempFile;
  } 

  private static File tempImageFile(File imageFile) {
   String path = imageFile.getPath();
   StringBuffer strB = new StringBuffer(path);
   strB.insert(path.lastIndexOf('.'),0);
   return new File(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));
  } 

 } 

OCR 类:

 package com.hhp.util;

 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 import org.jdesktop.swingx.util.OS; 

 public class OCR {
  private final String LANG_OPTION = "-l"; //英文字母小写l,并非数字1
  private final String EOL = System.getProperty("line.separator");
  private String tessPath = "C://Program Files (x86)//Tesseract-OCR";
  //private String tessPath = new File("tesseract").getAbsolutePath(); 

  public String recognizeText(File imageFile,String imageFormat)throws Exception{
   File tempImage = ImageIOHelper.createImage(imageFile,imageFormat);
   File outputFile = new File(imageFile.getParentFile(),"output");
   StringBuffer strB = new StringBuffer();
   List cmd = new ArrayList();
   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("eng"); 

   ProcessBuilder pb = new ProcessBuilder();
   pb.directory(imageFile.getParentFile()); 

   cmd.set(1, tempImage.getName());
   pb.command(cmd);
   pb.redirectErrorStream(true); 

   Process process = pb.start();
   //tesseract.exe 1.jpg 1 -l chi_sim
   int w = process.waitFor(); 

   //删除临时正在工作文件
   tempImage.delete(); 

   if(w==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();
   }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();
  }
 }

测试类TestOCR :

 import java.io.File;
 import java.io.IOException;

 import com.hhp.util.OCR;

 public class OcrTest {

  public static void main(String[] args) {
   String path = "C://temp//OCRcode//4.png";
   System.out.println("ORC Test Begin......");
   try {
    String valCode = new OCR().recognizeText(new File(path), "png");
    System.out.println(valCode);
   } catch (IOException e) {
    e.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   }
   System.out.println("ORC Test End......");
  } 

 }

经过测试,tesseract-ocr 3.01的文字识别率很高,对于网站中常见的验证码识别率也很高。


微信扫码,欢迎关注微信公众账号,更多精彩~

手机扫码加入QQ群,欢迎你~

识别率很高的java文字识别技术的更多相关文章

  1. Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址

     OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...

  2. Java文字识别软件-调用百度ocr实现文字识别

    java_baidu_ocr Java调用百度OCR文字识别API实现图片文字识别软件 这是一款小巧方便,强大的文字识别软件,由Java编写,配上了窗口界面 调用了百度ocr文字识别API 识别精度高 ...

  3. OCR文字识别帮助录入文字信息

    OCR文字识别是指将图片.照片上的文字内容,直接转换为可编辑文本的过程.目前各行各业不断地应用文字识别产品,解决文字录入工作的烦恼,提高工作效率. OCR文字识别用在哪里? 一个做社区工作的朋友透露, ...

  4. Android ocr识别文字介绍(文字识别)

    最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...

  5. Tesseract5.0训练字库,提高OCR特殊场景识别率(一)

    0.目标 很多特殊场景,原生的字库识别率不高,这时候就需要根据需求自己训练字库生成traineddata文件. 一.前期准备工作 1.安装jdk   用于运行jTessBoxEditor 2.安装jT ...

  6. NET 2.0 OCR文字识别技术(Tesseract 引擎)[转]

    一.OCR简介  参见http://baike.baidu.com/view/17761.htm?fr=ala0_1  大家参照,我第一次也是这么了解的,呵呵.高手见笑 现在市面上好多OCR 引擎,不 ...

  7. python3 图片文字识别

    最近用到了图片文字识别这个功能,从网上搜查了一下,决定利用百度的文字识别接口.通过测试发现文字识别率还可以.下面就测试过程简要说明一下 1.注册用户 链接:https://login.bce.baid ...

  8. 百度Ocr文字识别

    简述 最近开发一个项目需要用到Ocr文字识别技术来识别手写文字,在评估过程中体验了百度的文字识别和腾讯的文字识别.查找官方开发文档,发现它们都有印刷体和手写体两种符合项目需求的识别模式,但是腾讯的手写 ...

  9. Tesseract-OCR-03-图片文字识别

    Tesseract-OCR-03-图片文字识别 本篇介绍使用 Tesseract-OCR 做图片文字识别,识别手写文字的时候,正确率能达到 90%,当训练后正确率是极高的.这里介绍的图片文字识别,可以 ...

随机推荐

  1. python字符串操作实方法大合集

    python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下:   #1.去空格及特殊符号 s.st ...

  2. Libevent教程001: 简介与配置

    本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...

  3. 微信小程序开发之formId使用(模板消息)

    基于微信小程序的模板消息:基于微信的通知渠道,我们为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验.模板推送位置:服务通知模板下发条件:用户本人在微信体系内与页面有交互 ...

  4. n级阶梯,每次走一步或两步,问最多有多少种走法 二叉树实现

    NodeTree类 public class NodeTree { private int num; private NodeTree left; private NodeTree right; pu ...

  5. 了解tomcat的server.xml文件

    <?xml version='1.0' encoding='utf-8'?> <!-- Note: http://201605130349.iteye.com/blog/229898 ...

  6. BZOJ_4530_[Bjoi2014]大融合_LCT

    BZOJ_4530_[Bjoi2014]大融合_LCT Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个 ...

  7. CentOS7 通过YUM安装MySQL5.7

    1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...

  8. java线程同步小结

    1.线程同步的目的是为了防止多个线程同时访问一个资源时对资源的破坏 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无 ...

  9. CentOS DesktopEntry

    IBM Developer  :  https://www.ibm.com/developerworks/cn/linux/l-cn-dtef/index.html [Desktop Entry] N ...

  10. python--装饰器(附偏函数、断言)

    博客地址:http://www.cnblogs.com/yudanqu/ 概念:装饰器是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数 装饰器就是在我们需要的一个函数外 ...