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. Markdown 编辑器语法 专题

    基本技巧 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` 实现 通常编辑器根据代码片段适配合适的高亮方法,但你也可以用 ```(tab键上的符号,要从每行 ...

  2. css的div垂直居中的方法,百分比div垂直居中

    前言 我们都知道,固定高宽的div在网页中垂直居中很简单,相信大家也很容易的写出来,但是不是固定高宽的div如何垂直居中呢?我们在网页布局,特别是手机等web端网页经常是不固定高宽的div,那么这些d ...

  3. CSS透明opacity和IE各版本透明度滤镜filter的准确用法

    滤镜名    说明 Alpha     让HTML元件呈现出透明的渐进效果Blur     让HTML元件产生风吹模糊的效果Chroma     让图像中的某一颜色变成透明色DropShadow    ...

  4. 对象和XML文件的转换

    很多时候,我们开发程序都需要使用到对象的XML序列化和反序列化,对象的XML序列化和反序列化,既可以使用XML对象(XmlDocument)进行操作,也可以使用XmlSerializer进行操作,两个 ...

  5. bzoj 3166 可持久化Tire

    每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstd ...

  6. bzoj 4318 OSU 概率期望dp

    可以发现:f[i]转移到f[i+1]只和最后一串1的长度和平方有关, 因为如果新加的位置是1,贡献就是(x+1)^3-x^3=3x^2+3x+1,否则为0: 所以对于每一个位置,处理出期望的f,x和x ...

  7. STM32基于固件库新建MDK工程模板(精简版)

    上个博文理论讲解的东西太多,太复杂,这里把所有步骤全部贴出 1.新建一个工程文件夹LED 2.LED文件夹下建立如下文件夹 3.Project –>New Uvision Project 到US ...

  8. linux服务器 jboss-7安装

    jBoss简介 JBoss是一个运行EJB的J2EE应用服务器.它是开放源代码的项目,遵循最新的J2EE规范.从JBoss项目开始至今,它已经从一个EJB容器发展成为一个基于的J2EE的一个web 操 ...

  9. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  10. 基于async/non-blocking高性能redis组件库BeetleX.Redis

    BeetleX.Redis是基于async/non-blocking模式实现的高性能redis组件库,组件支持redis基础指令集,并封装更简便的List,Hashset和Subscribe操作.除了 ...