识别率很高的java文字识别技术

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的文字识别率很高,对于网站中常见的验证码识别率也很高。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现远程控制技术完整源代码分享

    Java实现远程控制技术 java自带的java.net.和java.awt.robot. 的混合可以用于实现通过网络对另一台计算机的远程控制,其中包括控制远程计算机鼠标的动作和键盘的输入,以及实时获得远程计算机屏幕的图像.本文将用简洁的语言和由浅入深的逻辑,教大家如何掌握这个技术. 首先先看一下效果图: 远程端计算机界面: 控制端计算机界面: 控制端输入: 远程端输入: 一下开始详细介绍远程控制的技术思路. 首先两台计算机通过java.net的Socket来进行连接. 一端先打开一个Serve

  • java的poi技术读取和导入Excel实例

    报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑.Java程序由于其跨平台特性,不能直接操纵Excel.因此,本文探讨一下POI视线Java程序进行Excel的读取和导入. 项目结构: java_poi_excel 用到的Excel文件: xls XlsMain .java 类 //该类有main方法,主要负责运行程序,同时该类中也包含了用poi读取Excel(2003版) import java.io.FileInputStream; impor

  • 分页技术原理与实现之Java+Oracle代码实现分页(二)

    紧接着上篇-分页技术原理与实现之分页的意义及方法(一) ,本篇继续分析分页技术.上篇讲的是分页技术的简单原理与介绍,这篇深入分析一下分页技术的代码实现. 上篇最后讲到了分页的最佳实现是在数据库层进行分页,而且不同的数据库有不同的分页实现,比如Oracle是用三层sql嵌套实现分页的.MySQL是用limit关键字实现的(上篇已讲到). 这篇以Java+Oracle为基础,讲解代码层的实现. 就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pag

  • 你应该知道的21个Java核心技术

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的.和Java中各个框架相关的内容. 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容. 1. JVM相

  • 总结Java常用到的六个加密技术和代码

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些资料将加密直接分为对称加密和非对称加密). 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文.而单向加密只是对信息进行了摘要计算,不能通过算法生成明文,单向加密从严格意思上说不能算是加密的一种,应该算是摘要算法吧. 具体来说: 系统必须可用,非数学上不可译码. 系统不一定要保密,可以轻

  • JAVA使用JDBC技术操作SqlServer数据库实例代码

    JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序. JDBC并不能直接访问数据库,需要借助于数据库厂商提供的JDBC驱动程序. 数据库连接 如果要在Java访问数据库,首先要加载一个数据库驱动,数据库驱动只需要在第一次访问时加载一次.然后再每次访问

  • Java UrlRewriter伪静态技术运用深入分析

    通常我们为了更好的缓解服务器压力,和增强搜索引擎的友好面,都将文章内容生成静态页面. 但是有时为了能实时的显示一些信息,或者还想运用动态脚本解决一些问题,不能用静态的方式来展示网站内容,必须用到动态页面显示. 这样以来,就损失了对搜索引擎的友好面,怎么样在两者之间找个中间方法呢,如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的站点? 这就需要你美化你的网页的地址,这就产生了伪静态技术,也就是我们常说的Url Rewriter重写技术.就是当我们访问一个页面时,地址栏中展示出来的是以".h

  • PHP、JAVA、.NET这三种技术的区别分析

    其实这三种编程技术各有优势,我们大概可以从语言.平台这二点来区分: 一.语言: PHP:PHP产生与1994年,其语法混合了C.Java.Perl 和他自创的一些编程语法:PHP是嵌入在HTML中执行的:它也是一种解释性语言.早期的PHP并非完全的面向对象编程语言,到了PHP4以后的版本才开始有了面向对象的概念. JAVA:JAVA产生与1995年,JAVA语言和JAVA平台统称为JAVA:它语法与C语言和C++语言很接近,并且JAVA是面向对象编程语言,JAVA是编译性语言,可以先将JAVA源

  • Java中四种XML解析技术

    在平时工作中,难免会遇到把 XML 作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为). 预 备 测试环境: AMD 毒龙1.4G OC 1.5G.256M DDR333.Windows2000 Server SP4.Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在 Debug 模式下测试. XML 文件格式如下: <?

  • JAVA Web实时消息后台服务器推送技术---GoEasy

    越来越多的项目需要用到实时消息的推送与接收,我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari等等. 支持不同的开发语言:GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过Restful API来实现后台实时推送.

随机推荐