java图片识别文字的方法

作者:tiny_lxf 时间:2021-11-11 02:43:03 

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

来源:https://blog.csdn.net/tiny_lxf/article/details/78533485

标签:java,图片识别,识别文字
0
投稿

猜你喜欢

  • Springboot 异步任务和定时任务的异步处理

    2022-08-20 07:21:12
  • java web监听器统计在线用户及人数

    2023-12-14 14:42:52
  • Java 数据库连接池详解及简单实例

    2023-08-10 15:54:07
  • 浅谈Java多线程编程中Boolean常量的同步问题

    2021-06-20 16:36:26
  • 使用Java实现qq邮箱发送邮件

    2023-10-14 18:24:36
  • Java实现多任务执行助手

    2023-05-17 14:15:30
  • Java Scala实现数据库增删查改操作详解

    2022-02-03 05:09:22
  • Java反射(Class类,Class对象获取)

    2021-06-27 05:55:24
  • springboot扩展MVC的方法

    2023-12-15 14:19:05
  • java中List删除时需要的注意事项

    2023-11-11 01:28:00
  • 详解通过JDBC进行简单的增删改查(以MySQL为例)

    2023-08-14 20:16:40
  • Java中Steam流的用法详解

    2021-12-16 14:18:50
  • springboot ErrorPageFilter的实际应用详解

    2023-11-24 01:02:59
  • 为什么Java开发需要配置环境变量

    2023-08-13 13:11:03
  • 深入了解Spring中最常用的11个扩展点

    2023-07-05 17:46:40
  • mybatis-plus分页查询的实现示例

    2023-11-25 04:57:57
  • Springboot 项目读取Resources目录下的文件(推荐)

    2023-07-27 09:40:47
  • Java中的Struts2框架拦截 器之实例代码

    2023-06-21 19:04:03
  • Flutter 状态管理的实现

    2023-08-21 02:38:33
  • IDEA 2020 本土化,真的是全中文了(真香)

    2023-11-25 08:02:58
  • asp之家 软件编程 m.aspxhome.com