资讯信息
       宝鸡楼市
       二手房行情
       租赁行情
       商品住宅日成交
       预售许可证
    重点房源推介
    政策法律
    全国人大
    国务院
       行政法规
       国发国办文件
    部委规章文件
       住建部规章
       住建部文件
       财政税务局
       其它部委及法院
    省级法规及文件
    市级文件
       市政府文件
       市级部门文件
    证券法律政策
    专题报道
       经验分享
       资料分享
       股票知识
       健康保健
    加盟八千家
       加盟八千家
       经纪人天地
   
   当前位置--八千家资讯--经验分享--正文

Java文字识别技术
    您访问8000j·宝鸡房地产网    录入:绿叶 时间:2014-05-27 07:41:50  点击数:1680    

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

                                      来源:http://www.apkbus.com/android-89703-1-1.html

 

android的文字识别OCR

1.
功能:
光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程
2.
典型应用:
名片扫描
3.
android源码实现:
external/tesseract/*
4.
编译:
$ cd external/tesseract/
$ mm
生成libocr.so,push系统/system/lib/中,它也可以放在软件的安装包里
5.
例程下载:
2)
直接下载apk是能用的, 在源码中编译程序运行就退出,是由于可能libocr.so未安装, 把它push到系统中即可
$ adb push libocr.so /data/data/com.itwizard.mezzofanti/lib/
3)
主要借鉴OCR.java它是对libocr.so库的调用(JNI方式)

 

                                       发表于 2011-6-2 15:31:52

  • 上一篇文章: 如何让网页变黑白

  • 下一篇文章: 手机新闻客户端如何从“眼球”中看到“钱景”?
  • 发表评论打印此文】【关闭窗口
      网友评论:(评论内容只代表网友观点,与本站立场无关!)
        没有任何评论


    Copyright @2005 All Rights Reserved
    版权所有:8000j网(八千家)
    声明:本网站文章、数据来源于网络,仅供学习之用,不构成投资建议,如有侵权,电函后3日内删除。
    电话:0917-15309175008 E-mail:8000j@163.com
    八千里路云和月,让爱有个家!——八千家(8000j)