Java tesseract-ocr 图文识别技术 Java代码实现

Java文字识别程序的关键是寻找一个可以调用

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 = (ImageReader) 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 = (ImageWriter) 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引擎。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 类:

[html] view plain copy

  1. import java.awt.image.BufferedImage;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.util.Iterator;  
  5. import java.util.Locale;  
  6.   
  7. import javax.imageio.IIOImage;  
  8. import javax.imageio.ImageIO;  
  9. import javax.imageio.ImageReader;  
  10. import javax.imageio.ImageWriteParam;  
  11. import javax.imageio.ImageWriter;  
  12. import javax.imageio.metadata.IIOMetadata;  
  13. import javax.imageio.stream.ImageInputStream;  
  14. import javax.imageio.stream.ImageOutputStream;  
  15.   
  16. import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;  
  17.   
  18. public class ImageIOHelper {    
  19.         
  20.     public static File createImage(File imageFile, String imageFormat) {    
  21.         File tempFile = null;    
  22.         try {    
  23.             Iterator readers = ImageIO.getImageReadersByFormatName(imageFormat);    
  24.             ImageReader reader = readers.next();    
  25.             
  26.             ImageInputStream iis = ImageIO.createImageInputStream(imageFile);    
  27.             reader.setInput(iis);    
  28.             //Read the stream metadata    
  29.             IIOMetadata streamMetadata = reader.getStreamMetadata();    
  30.                 
  31.             //Set up the writeParam    
  32.             TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);    
  33.             tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);    
  34.                 
  35.             //Get tif writer and set output to file    
  36.             Iterator writers = ImageIO.getImageWritersByFormatName("tiff");    
  37.             ImageWriter writer = writers.next();    
  38.                 
  39.             BufferedImage bi = reader.read(0);    
  40.             IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));    
  41.             tempFile = tempImageFile(imageFile);    
  42.             ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);    
  43.             writer.setOutput(ios);    
  44.             writer.write(streamMetadata, image, tiffWriteParam);    
  45.             ios.close();    
  46.                 
  47.             writer.dispose();    
  48.             reader.dispose();    
  49.                 
  50.         } catch (IOException e) {    
  51.             e.printStackTrace();    
  52.         }    
  53.         return tempFile;    
  54.     }    
  55.     
  56.     private static File tempImageFile(File imageFile) {    
  57.         String path = imageFile.getPath();    
  58.         StringBuffer strB = new StringBuffer(path);    
  59.         strB.insert(path.lastIndexOf('.'),0);    
  60.         return new File(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));    
  61.     }    
  62.     
  63. }  


 

OCR 类:

[html] view plain copy

  1. package com.hhp.util;  
  2.   
  3. import java.io.BufferedReader;    
  4. import java.io.File;    
  5. import java.io.FileInputStream;    
  6. import java.io.InputStreamReader;    
  7. import java.util.ArrayList;    
  8. import java.util.List;    
  9. import org.jdesktop.swingx.util.OS;    
  10.     
  11. public class OCR {    
  12.     private final String LANG_OPTION = "-l";  //英文字母小写l,并非数字1    
  13.     private final String EOL = System.getProperty("line.separator");    
  14.     private String tessPath = "C://Program Files (x86)//Tesseract-OCR";    
  15.     //private String tessPath = new File("tesseract").getAbsolutePath();    
  16.         
  17.     public String recognizeText(File imageFile,String imageFormat)throws Exception{    
  18.         File tempImage = ImageIOHelper.createImage(imageFile,imageFormat);    
  19.         File outputFile = new File(imageFile.getParentFile(),"output");    
  20.         StringBuffer strB = new StringBuffer();    
  21.         List cmd = new ArrayList();    
  22.         if(OS.isWindowsXP()){    
  23.             cmd.add(tessPath+"//tesseract");    
  24.         }else if(OS.isLinux()){    
  25.             cmd.add("tesseract");    
  26.         }else{    
  27.             cmd.add(tessPath+"//tesseract");    
  28.         }    
  29.         cmd.add("");    
  30.         cmd.add(outputFile.getName());    
  31.         cmd.add(LANG_OPTION);    
  32.         cmd.add("chi_sim");    
  33.         //cmd.add("eng");    
  34.             
  35.         ProcessBuilder pb = new ProcessBuilder();    
  36.         pb.directory(imageFile.getParentFile());    
  37.             
  38.         cmd.set(1, tempImage.getName());    
  39.         pb.command(cmd);    
  40.         pb.redirectErrorStream(true);    
  41.             
  42.         Process process = pb.start();    
  43.         //tesseract.exe 1.jpg 1 -l chi_sim    
  44.         int w = process.waitFor();    
  45.             
  46.         //删除临时正在工作文件    
  47.         tempImage.delete();    
  48.             
  49.         if(w==0){    
  50.             BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));    
  51.                 
  52.             String str;    
  53.             while((str = in.readLine())!=null){    
  54.                 strB.append(str).append(EOL);    
  55.             }    
  56.             in.close();    
  57.         }else{    
  58.             String msg;    
  59.             switch(w){    
  60.                 case 1:    
  61.                     msg = "Errors accessing files.There may be spaces in your image's filename.";    
  62.                     break;    
  63.                 case 29:    
  64.                     msg = "Cannot recongnize the image or its selected region.";    
  65.                     break;    
  66.                 case 31:    
  67.                     msg = "Unsupported image format.";    
  68.                     break;    
  69.                 default:    
  70.                     msg = "Errors occurred.";    
  71.             }    
  72.             tempImage.delete();    
  73.             throw new RuntimeException(msg);    
  74.         }    
  75.         new File(outputFile.getAbsolutePath()+".txt").delete();    
  76.         return strB.toString();    
  77.     }    
  78. }    
  79.   
  80.   
  81.    


测试类TestOCR :

 

[html] view plain copy

  1. import java.io.File;  
  2. import java.io.IOException;  
  3.   
  4. import com.hhp.util.OCR;  
  5.   
  6. public class OcrTest {  
  7.   
  8.  public static void main(String[] args) {  
  9.         String path = "C://temp//OCRcode//4.png";       
  10.         System.out.println("ORC Test Begin......");  
  11.         try {       
  12.             String valCode = new OCR().recognizeText(new File(path), "png");       
  13.             System.out.println(valCode);       
  14.         } catch (IOException e) {       
  15.             e.printStackTrace();       
  16.         } catch (Exception e) {    
  17.             e.printStackTrace();    
  18.         }         
  19.         System.out.println("ORC Test End......");  
  20.     }    
  21.   
  22. }  


经过测试,tesseract-ocr 3.01的文字识别率很高,对于网站中常见的验证码识别率也很高。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ImageComparerUI——基于Java语言实现的相似图像识别,基于直方图比较算法。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; public class ImageComparerUI extends JComponent implements ActionListener { /** * */ private static final long serialVersionUID = 1L; private JButton browseBtn; private JButton histogramBtn; private JButton compareBtn; private Dimension mySize; // image operator private MediaTracker tracker; private BufferedImage sourceImage; private BufferedImage candidateImage; private double simility; // command constants public final static String BROWSE_CMD = "Browse..."; public final static String HISTOGRAM_CMD = "Histogram Bins"; public final static String COMPARE_CMD = "Compare Result"; public ImageComparerUI() { JPanel btnPanel = new JPanel(); btnPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); browseBtn = new JButton("Browse..."); histogramBtn = new JButton("Histogram Bins"); compareBtn = new JButton("Compare Result"); // buttons btnPanel.add(browseBtn); btnPanel.add(histogramBtn); btnPanel.add(compareBtn); // setup listener... browseBtn.addActionListener(this); histogramBtn.addActionListener(this); compareBtn.addActionListener(this); mySize = new Dimension(620, 500); JFrame demoUI = new JFrame("Similiar Image Finder"); demoUI.getContentPane().setLayout(new BorderLayout()); demoUI.getContentPane().add(this, BorderLayout.CENTER); demoUI.getContentPane().add(btnPanel, BorderLayout.SOUTH); demoUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); demoUI.pack(); demoUI.setVisible(true); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; if(sourceImage != null) { Image scaledImage = sourceImage.getScaledInstance(300, 300, Image.SCALE_FAST); g2.drawImage(scaledImage, 0, 0, 300, 300, null); } if(candidateImage != null) { Image scaledImage = candidateImage.getScaledInstance(300, 330, Image.SCALE_FAST); g2.drawImage(scaledImage, 310, 0, 300, 300, null); } // display compare result info here Font myFont = new Font("Serif", Font.BOLD, 16); g2.setFont(myFont); g2.setPaint(Color.RED); g2.drawString("The degree of similarity : " + simility, 50, 350); } public void actionPerformed(ActionEvent e) { if(BROWSE_CMD.equals(e.getActionCommand())) { JFileChooser chooser = new JFileChooser(); chooser.showOpenDialog(null); File f = chooser.getSelectedFile(); BufferedImage bImage = null; if(f == null) return; try { bImage = ImageIO.read(f); } catch (IOException e1) { e1.printStackTrace(); } tracker = new MediaTracker(this); tracker.addImage(bImage, 1); // blocked 10 seconds to load the image data try { if (!tracker.waitForID(1, 10000)) { System.out.println("Load error."); System.exit(1); }// end if } catch (InterruptedException ine) { ine.printStackTrace(); System.exit(1); } // end catch if(sourceImage == null) { sourceImage = bImage; }else if(candidateImage == null) { candidateImage = bImage; } else { sourceImage = null; candidateImage = null; }
### 回答1: Tesseract-OCR 是一个开源的字符识别库,支持多种语言,其适用于通过光学字符识别OCR技术处理身份证信息。而 Java Tesseract-OCR 是基于 Tesseract-OCRJava API,为开发人员提供了在 Java 程序中使用 Tesseract-OCR 的功能。 使用 Java Tesseract-OCR 处理身份证,首先需要安装 Tesseract-OCR 的依赖库,并将其与 Java 项目进行集成。然后,可以通过 Java Tesseract-OCR 提供的 API,对身份证进行文字识别识别身份证的过程一般包括以下几个步骤: 1. 图像预处理:首先需要加载身份证图片并进行预处理,包括图像灰度化、二值化等操作,以便提高识别的准确性。 2. 文字识别:使用 Java Tesseract-OCR 的 API,对预处理后的图像进行文字识别。可以根据需求,选择不同的识别模式和语言设置,以达到更好的识别效果。 3. 结果输出:获取到识别结果后,可以将识别的文字信息输出到控制台、文件或者存储到数据库中。 需要注意的是,由于身份证上的文字信息存在一定的特殊性,如字体、背景等因素的影响,识别的准确率可能会受到一些限制。因此,在使用 Java Tesseract-OCR 进行身份证文字识别时,可能需要对图片进行适当的预处理,以及对识别结果进行后期的校验和修正,以保证最终的准确性。 总之,Java Tesseract-OCR 是一个强大的工具,能够帮助开发人员在 Java 程序中实现身份证文字识别功能,但需要根据实际情况对其进行调试和优化,以达到更好的识别效果。 ### 回答2: Java Tesseract-OCR是一个基于Java开发的OCR(光学字符识别)库,可以用于识别身份证。OCR技术可以将身份证上的文字和数字转化为计算机可读的文本数据,从而实现身份证信息的自动化处理和识别。 使用Java Tesseract-OCR识别身份证,首先需要将身份证的图像文件加载到程序中。然后,通过调用相应的方法,对图像进行预处理和分析。预处理包括图像二值化、去噪等操作,以提高识别准确度。接下来,调用OCR识别方法,将图像转化为文本数据。最后,对识别结果进行后期处理和分析,提取身份证上的各项信息。 使用Java Tesseract-OCR识别身份证有以下几个优点。首先,Java Tesseract-OCR是一个开源的OCR库,提供了丰富的功能和灵活的定制选项,可以根据具体需求进行配置和调整。其次,Java Tesseract-OCR是基于Tesseract引擎开发的,该引擎是目前最为成熟和广泛应用的OCR引擎之一,具有较高的识别准确度和稳定性。再次,Java Tesseract-OCR支持多种图像格式和语言,可以应对不同类型和语种的身份证识别需求。 总而言之,Java Tesseract-OCR是一个强大而灵活的工具,可以用于身份证的OCR识别。通过使用该工具,可以实现身份证信息的自动化处理和识别,提高工作效率和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值