java视觉识别:java文字识别技术 亲测 识别率很高
java视觉识别:java文字识别技术 亲测 识别率很高测试类TestOCR :OCR 类:3.到网上搜索下载java图形处理所需的2个包:jai_imageio-1.1-alpha.jar,swingx-1.6.1.jar4.java程序清单:ImageioHelper 类:
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.jpg";
- System.out.println("ORC Test Begin......");
- try {
- String valCode = new OCR().recognizeText(new File(path) .jpg");
- System.out.println(valCode);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("ORC Test End......");
- }
- }
经过测试,tesseract-ocr 3.01的文字识别率很高,对于网站中常见的验证码识别率也很高。