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

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

(0)

相关推荐

  • java指纹识别以及谷歌图片识别技术源码

    本文实例为大家分享了java指纹识别和图片识别源代码,供大家参考,具体内容如下 主类: import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; public class SimilarImageSearch { /** * @param args */ public static void main(String[] args) { List<String> hashCode

  • java实现腾讯ocr图片识别接口调用

    最近开发了一个拍车牌识别车牌号的功能,主要调用了腾讯的ocr车牌识别接口,直接上代码: 首先生成签名以及读取配置的工具类: package com.weaver.formmodel.integration.ocr; import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import weaver.general.Base64; public class SignUtil

  • Java基于直方图应用的相似图片识别实例

    本文实例讲述了Java实现基于直方图应用的相似图片识别,是非常实用的技巧.分享给大家供大家参考.具体分析如下: 一.算法概述: 首先对源图像与要筛选的图像进行直方图数据采集,对采集的各自图像直方图进行归一化再使用巴氏系数算法对直方图数据进行计算,最终得出图像相似度值,其值范围在[0, 1]之间 0表示极其不同,1表示极其相似(相同). 二.算法步骤详解: 大致可以分为两步,根据源图像与候选图像的像素数据,生成各自直方图数据.第二步:使用第一步输出的直方图结果,运用巴氏系数(Bhattachary

  • Windows下Java调用OCR进行图片识别

    使用Java语言,通过Tesseract-OCR对图片进行识别. 1.Tesseract-OCR 下载windows版本并安装. 2.程序如下: a.ImageIOHelper类 package OCR; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Locale; import ja

  • 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.下载安装tessera

  • java实现新浪微博Oauth接口发送图片和文字的方法

    本文实例讲述了java实现新浪微博Oauth接口发送图片和文字的方法.分享给大家供大家参考.具体如下: 基于网上很多人利用新浪api开发新浪微博客户端的时候遇到无法发图片的问题,很多人卡在了这一布.现将代码呈上,希望能帮到一些朋友. /** * 发表带图片的微博 * @param token * @param tokenSecret * @param aFile * @param status * @param urlPath * @return */ public String uploadS

  • Android编程实现给Button添加图片和文字的方法

    本文实例讲述了Android编程实现给Button添加图片和文字的方法.分享给大家供大家参考,具体如下: //为按钮添加图片和文字的方法 public Spanned getSpan(int id, String s) { ImageGetter imgGetter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { // TODO Auto-generated method stub

  • pyqt 实现在Widgets中显示图片和文字的方法

    思路非常简单:<p>创建window,设置窗口大小,创建label1,导入图片,创建label2,导入文字,show,结束!</p> import sys from PyQt5 import QtWidgets,QtGui #定义窗口函数window def window(): #我事实上不太明白干嘛要这一句话,只是pyqt窗口的建立都必须调用QApplication方法 app=QtWidgets.QApplication(sys.argv) #新建一个窗口,名字叫做w w=Qt

  • php给图片添加文字水印方法汇总

    1: 面向过程的编写方法 //指定图片路径 $src = '001.png'; //获取图片信息 $info = getimagesize($src); //获取图片扩展名 $type = image_type_to_extension($info[2],false); //动态的把图片导入内存中 $fun = "imagecreatefrom{$type}"; $image = $fun('001.png'); //指定字体颜色 $col = imagecolorallocateal

  • Java图片处理 (文字水印、图片水印、缩放、补白)代码实例

    package com.hmw.picMark; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.im

  • java图片格式转换的三段代码

    网上关于java图片格式内容的文章不是很多,也不是很完整,小编搜集了三段java图片格式转换代码,分享给大家: 第一段:java图片格式转换代码 import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Scanner; import javax.imageio.*; public class FormatConversion { public st

  • java图片对比度调整示例代码

    前言 本文主要给大家介绍了关于java图片对比度调整的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下 测试代码 public static void main(String[] args) { //文件与BufferedImage间的转换 BufferedImage bi=file2img("test.jpg"); //读取图片 BufferedImage bii=img_color_contrast(bi,100); img2file(bii,&quo

  • Python 实现给图片加文字或logo水印

    目录 前言 环境依赖 代码 验证一下 执行结果 前言 本文提供给图片添加文字或者logo图片水印的python工具,打造专属图片. 环境依赖 ffmpeg环境安装,ffmpy安装: pip install ffmpy -i https://pypi.douban.com/simple 代码 上代码. #!/user/bin/env python # coding=utf-8 """ @project : csdn @author : 剑客阿良_ALiang @file : i

随机推荐