服务器之家

服务器之家 > 正文

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

时间:2020-06-08 12:10     来源/作者:ycb1689

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 类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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 类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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 :

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的文字识别率很高,对于网站中常见的验证码识别率也很高。

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

标签:

相关文章

热门资讯

歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
返回顶部