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

以上就是本文的全部内容,希望对大家的学习有所帮助,如果你也在学习java,在入门学习java的过程当中有遇见任何问题,你都可以加入我的java学习交流群:615741636,群文件有我这几年整理的java学习手册,面试题,开发工具,PDF文档书籍,你可以自行下载。

猜你喜欢

转载自blog.csdn.net/qq_42755528/article/details/89413992