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中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 浅拷贝 l1 = [1,2,3 ...

  2. Debian虚拟机安装VirtualBox增强功能

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=573 本文中使用的Debian是安装在VirtualBox中的虚拟机,具体参数如下: Debian版本:Linux de ...

  3. 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

        系列文章目录:     <微服务设计>读书笔记大纲 一.CI(Continuous Integration)简介  CI规则1:尽量频繁地把代码签入到分支中以进行集成 CI规则2: ...

  4. PHP写的爬虫,爬指定网站页面上的各种图片

    打算用php实现一个爬虫,这是爬指定页面的图片的一段程序,其他的部分还没调试好,先把这个放上来 <?php $string=file_get_contents("http://www. ...

  5. VM虚拟机下安装liunx系统

    1.首先打开VMware看到如图所示,然后点击创建虚拟机,选择典型然后下一步 2.选择我稍后安装操作系统然后下一步,选择Linux系统然后下一步.给虚拟机起一个名字,和选择把虚拟机安装在那个位置.然后 ...

  6. python 写日志

    简单配置 日志级别 级别 何时使用 DEBUG 详细信息,典型地调试问题时会感兴趣. INFO 证明事情按预期工作. WARNING 表明发生了一些意外,或者不久的将来会发生问题(如'磁盘满了').软 ...

  7. pyc

    当运行一个高级程序的时候,需要一个翻译机把高级语言变成计算机能读懂的机器语言的过程.这个过程分为两类: 编译 在程序执行之前,先通过编译器对程序执行一个编译的过程,把程序变成机器语言,运行时就不需要翻 ...

  8. ThreadPoolExecutor简介

    ThreadPoolExecutor简介 并发包中提供的一个线程池服务 23456789 public ThreadPoolExecutor(int corePoolSize,//线程池维护线程的最少 ...

  9. 【prufer编码】BZOJ1211 [HNOI2004]树的计数

    Description 给定一棵树每个节点度的限制为di,求有多少符合限制不同的树. Solution 发现prufer码和度数必然的联系 prufer码一个点出现次数为它的度数-1 我们依然可以把树 ...

  10. Travel 并查集

    题意:给一个图,若干询问,每次询问只经过边权<=w的边,x能到达的点数 并查集啊,对询问和边排序,直接合并,维护size,查询 #include<cstdio> #include&l ...