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提示“未能创建类型”处理

    我是在本机启动IIS Express调试一个ashx(一般处理程序)时遇到这个报错,网上的说法普遍有这么几种: 把bbb.ashx中的Class="aaa.bbb" 改为Class ...

  2. Ueditor 专题

    https://github.com/xwjie/SpringBootUeditor 提交表单提交表单设置按照部署编辑器的教程,完成编辑器加载 把容器放到form表单里面,设置好要提交的路径,如下面代 ...

  3. 关于<input type="date">这种取值的问题 【原创】

    举例 <input type="date" id="date1"> var num = $("#date1").val(); a ...

  4. nodejs模块xml2js解析xml的坑

    在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: <xml> <MsgId>6197906553041859764</MsgId> &l ...

  5. 安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题

    安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题 都是因为这个进程没有启动起来,你只需要在启动后在终端输入 "/usr/bin /vmware-user" 就可以手动 ...

  6. java8中stream的map和flatmap的理解

    转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...

  7. [NOIP2002]字串变换 T2 双向BFS

    题目描述 已知有两个字串  A,B  及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在  A$中的子串  A1可以变换为可以变换为B1.A2可以变换为可 ...

  8. canvas实现俄罗斯方块

    好久没使用canvas了,于是通过写小游戏"俄罗斯方块"再次熟悉下canvas,如果有一定的canvas基础,要实现还是不难的.实际完成的Demo请看:canvas俄罗斯方块 . ...

  9. 【转】mip-semi-fixed 走走又停停

    写在前面 MIP 中悬浮元素的特殊情况 其实组件上线已经有一段时间了,最开始看到这个需求是站长提交了一个这中功能的组件过来,不过看过代码立刻就想到了 MIP 页面的特殊性:从结果页打开的 MIP 页面 ...

  10. Telerik控件集-2019.R1.SP1.All

    Telerik 专注于微软.Net平台的表示层与内容管理控件,提供高度稳定性和丰富性能的组件产品DevCraft,并可应用在非常严格的环境中.Telerik拥有 Microsoft, HP, Alco ...