식별률이 높은 자바 문자 식별 기술

6620 단어 java문자 인식
자바 문자인식 프로그램의 관건은 호출할 수 있는 OCR 엔진을 찾는 것이다.tesseract-ocr는 1985년부터 1995년까지 HP 실험실에서 개발된 OCR 엔진으로 현재 Google에 있습니다.tesseract-ocr 3.0 발표, 중국어 지원.그러나tesseract-ocr 3.0은 도형화 인터페이스의 클라이언트가 아닙니다. 다른 사람이 쓴FreeOCR 도형화 클라이언트는 새로운 3.0traineddata를 가져오는 것을 지원하지 않습니다.그러나 이것은 현재 자유로운 중국어 OCR 소프트웨어가 있다는 것을 상징한다.
java에서 tesseract-ocr3.01을 사용하는 절차는 다음과 같습니다.
1.tesseract-ocr-setup-3.01-1 설치를 다운로드합니다.exe(3.0 이상 버전에서만 중국어 식별 가능)
2. 설치 마법사에서 다운로드할 언어 패키지를 선택할 수 있습니다. 
3. 인터넷 검색으로 자바 그래픽 처리에 필요한 가방 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-ocr3.01의 문자인식률이 높고 사이트에서 흔히 볼 수 있는 인증코드 식별률도 높다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기