全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java实现图片文字识别ocr

最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo

在此之前,使用这个工具需要在本地安装OCR工具:

下面一个是一定要安装的离线包,建议默认安装

上面一个是中文的语言包,如果网络可以FQ的童鞋可以在安装的时候就选择语言包在线安装,有多种语言可供选择,默认只有英文的

exe安装好之后,把上面一个文件拷到安装目录下tessdata文件夹下

如C:\Program Files (x86)\Tesseract-OCR\tessdata下

然后下面两个是可选包,如果图片不做临时文件处理的话,可以不需要带的

首先是一个临时文件生成用的类以防源文件损坏,参考某位博友的例子@Gunner

package org.ink.image.textrz;

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 {
  private Locale locale=Locale.CHINESE;
  /**
   * user set locale Construct
   * @param locale
   */
  public ImageIOHelper(Locale locale){
    this.locale=locale;
  }
  
  /**
   * default construct using default locale Locale.CHINESE
   */
  public ImageIOHelper(){
    
  }
  /**
   * create tempFile of Image in order to prevent damaging original file
   * @param imageFile
   * @param imageFormat like png,jps .etc
   * @return TempFile of Image
   * @throws IOException
   */
  public File createImage(File imageFile, String imageFormat) throws IOException {  
    Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);  
    ImageReader reader = readers.next();  
    ImageInputStream iis = ImageIO.createImageInputStream(imageFile);  
    reader.setInput(iis);  
    IIOMetadata streamMetadata = reader.getStreamMetadata();  
    TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);  
    tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);  
    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");  
    ImageWriter writer = writers.next();  
    BufferedImage bi = reader.read(0);  
    IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));  
    File tempFile = tempImageFile(imageFile);  
    ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);  
    writer.setOutput(ios);  
    writer.write(streamMetadata, image, tiffWriteParam);  
    ios.close();
    iis.close();
    writer.dispose();  
    reader.dispose();  
    return tempFile;  
  }  
  /**
   * add suffix to tempfile
   * @param imageFile
   * @return
   * @throws IOException 
   */
  private File tempImageFile(File imageFile) throws IOException {  
    String path = imageFile.getPath();  
    StringBuffer strB = new StringBuffer(path);  
    strB.insert(path.lastIndexOf('.'),"_text_recognize_temp");
    String s=strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");
    Runtime.getRuntime().exec("attrib "+"\""+s+"\""+" +H"); //设置文件隐藏
    return new File(strB.toString()); 
  }  
  
} 

下面是真正识别的内容:

package org.ink.image.textrz;

import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;  
import java.util.ArrayList;  
import java.util.List;
import java.util.Locale;

import org.jdesktop.swingx.util.OS;  

/**
 * TEXT Recognize Utils
 * @author ink.Flower
 *
 */
public class OCRUtil { 
  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";//ocr默认安装路径
  private String transname="chi_sim";//默认中文语言包,识别中文
  
  /**
   * Construct method of OCR ,set Tesseract-OCR install path
   * @param tessPath Tesseract-OCR install path
   * @param transFileName traningFile name like eng.traineddata
   */
  public OCRUtil(String tessPath,String transFileName){
    this.tessPath=tessPath;
    this.transname=transFileName;
  }
  /**
   * Construct method of OCR,default path is "C://Program Files (x86)//Tesseract-OCR"
   */
  public OCRUtil(){   }
  
  public String getTessPath() {
    return tessPath;
  }
  public void setTessPath(String tessPath) {
    this.tessPath = tessPath;
  }
  public String getTransname() {
    return transname;
  }
  public void setTransname(String transname) {
    this.transname = transname;
  }
  public String getLANG_OPTION() {
    return LANG_OPTION;
  }
  public String getEOL() {
    return EOL;
  }
  
  /**
   * recognize text in image
   * @param imageFile
   * @param imageFormat
   * @return text recognized in image
   * @throws Exception
   */
  public String recognizeText(File imageFile,String imageFormat)throws Exception{  
    File tempImage = new ImageIOHelper().createImage(imageFile,imageFormat);  
    return ocrImages(tempImage, imageFile);  
  }  
  
  /**
   * recognize text in image
   * @param imageFile
   * @param imageFormat
   * @param locale
   * @return text recognized in image
   * @throws Exception
   */
  public String recognizeText(File imageFile,String imageFormat,Locale locale)throws Exception{  
    File tempImage = new ImageIOHelper(locale).createImage(imageFile,imageFormat);
    return ocrImages(tempImage, imageFile);
      
  }
  /**
   * 
   * @param tempImage
   * @param imageFile
   * @return
   * @throws IOException
   * @throws InterruptedException
   */
  private String ocrImages(File tempImage,File imageFile) throws IOException, InterruptedException{
    File outputFile = new File(imageFile.getParentFile(),"output");
    Runtime.getRuntime().exec("attrib "+"\""+outputFile.getAbsolutePath()+"\""+" +H"); //设置文件隐藏
    StringBuffer strB = new StringBuffer();  
    List<String> cmd = new ArrayList<String>();  
    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(transname);  
    ProcessBuilder pb = new ProcessBuilder();  
    pb.directory(imageFile.getParentFile());  
    cmd.set(1, tempImage.getName());  
    pb.command(cmd);  
    pb.redirectErrorStream(true);  
    Process process = pb.start();  
    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(); 
  }
}  

在实验中发现,如果对有多个文字的大图进行直接识别的话,效果可能比较差,所以可以参考另一篇切图的博文,将图片取一块之后再识别

https://www./article/121231.htm  ←我是链接

这样成功率会提高很多。

以上为离线识别版本,效率因图而已,具体使用的时候可以总结分析,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # ocr图片文字识别  # ocr文字识别  # ocr识别  # Java使用Tesseract-Ocr识别数字  # Java使用OCR技术识别验证码实现自动化登陆方法  # Java使用Tessdata做OCR图片文字识别的详细思路  # java实现腾讯ocr图片识别接口调用  # Java中实现OCR识别读取图片中的文字  # 不到十行实现javaCV图片OCR文字识别  # 用Java实现OCR功能揭秘  # java中实现OCR文字提取的几种方法(Tesseract、PaddleOCR及RapidOCR)  # 离线  # 临时文件  # 是一个  # 我是  # 多个  # 在此  # 英文  # 找了  # 不做  # 可选  # 相关资料  # 不需  # 要带  # 使用这个  # 有多种  # 大家多多  # 可供选择  # 装好  # 英文字母  # 有一个 


相关文章: 建站之星免费版是否永久可用?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  公司网站的制作公司,企业网站制作基本流程有哪些?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何选择最佳自助建站系统?快速指南解析优劣  建站之星会员如何解锁更多建站功能?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  学校为何禁止电信移动建设网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何快速搭建高效香港服务器网站?  平台云上自主建站:模板化设计与智能工具打造高效网站  建站之星备案是否影响网站上线时间?  设计网站制作公司有哪些,制作网页教程?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  网站制作公司,橙子建站是合法的吗?  营销式网站制作方案,销售哪个网站招聘效果最好?  高端建站如何打造兼具美学与转化的品牌官网?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  如何在腾讯云免费申请建站?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  高防服务器:AI智能防御DDoS攻击与数据安全保障  建站之星后台密码遗忘或太弱?如何重置与强化?  中山网站推广排名,中山信息港登录入口?  c# 服务器GC和工作站GC的区别和设置  内部网站制作流程,如何建立公司内部网站?  如何选择服务器才能高效搭建专属网站?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  定制建站策划方案_专业建站与网站建设方案一站式指南  如何选择美橙互联多站合一建站方案?  建站之星多图banner生成与模板自定义指南  大连 网站制作,大连天途有线官网?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何在IIS中新建站点并配置端口与物理路径?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  公司网站设计制作厂家,怎么创建自己的一个网站?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  网站微信制作软件,如何制作微信链接?  宝塔建站无法访问?如何排查配置与端口问题?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  东莞专业制作网站的公司,东莞大学生网的网址是什么?  TestNG的testng.xml配置文件怎么写  黑客如何利用漏洞与弱口令入侵网站服务器?  高性价比服务器租赁——企业级配置与24小时运维服务  建站上传速度慢?如何优化加速网站加载效率? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。