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. ASP.NET后台中调用前台Javascript函数的几种方法

    做web开发,用的技术是aspx.net,可是由于比较习惯于ASP现在做起来,觉得非常别扭,原因在于有很多功能其实在前台可以处理的,但是因为用到了很多webcontrol,导致不断postback.如 ...

  2. Linux kernel的中断子系统之(七):GIC代码分析

    返回目录:<ARM-Linux中断系统>. 总结: 原文地址:<linux kernel的中断子系统之(七):GIC代码分析> 参考代码:http://elixir.free- ...

  3. SpringBoot vue

    springboot 整合vue就行前后端完全分离,监听器,过滤器,拦截器 https://github.com/ninuxGithub/spring-boot-vue-separateA blog ...

  4. Java Code Examples for org.apache.ibatis.annotations.Insert

    http://www.programcreek.com/java-api-examples/index.php?api=org.apache.ibatis.annotations.Insert htt ...

  5. fastdfs group通过添加硬盘扩容

    通过给group的机器添加硬盘的方式,实现某个group的扩容. fastdfs在一台服务器支持多个store_path,每个store_path指向一个存储路径.url "M00/3F/E ...

  6. HTML5 CSS3专题 纯CSS打造相册效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30993277 今天偶然发现电脑里面还有这样的一个例子,感觉效果还不错,不记得啥时 ...

  7. 使用Spring MVC测试Spring Security Oauth2 API

    不是因为看到希望了才去坚持,而坚持了才知道没有希望. 前言 在Spring Security源码分析十一:Spring Security OAuth2整合JWT和Spring Boot 2.0 整合 ...

  8. 如何解决-win7系统打开截图工具显示“截图工具当前未在计算机上运行”

    打开win7系统自带截图工具,显示"截图工具当前未在计算机上运行.请重新启动计算机,然后重试",  解决方法  1.首先在C盘中搜索tpcps.dll: 2.将数据最大那个tpcp ...

  9. BZOJ_2595_[Wc2008]游览计划_斯坦纳树

    BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...

  10. 基于 Webpack 4 和 React hooks 搭建项目

    面对日新月异的前端,我表示快学不动了