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

java识别图片中文字技术相关推荐

  1. 单张、批量识别图片中文字(写入txt文件、窗口视图创建、打包.exe文件)(百度文字识别SDK+Python的GUI之tklinker+打包pyinstaller)

    昨天我姐问我有没有软件可以批量识别图片上的文字,她在帮客户做资料整理,但是用的方法只能一张一张上传识别,不仅效率低还浪费时间. ​我就找了找批量识别的软件,下载下来觉得:嗯?不错,界面也挺好,小东西做 ...

  2. python 识别图片中的中文_python识别图片中文字的方法

    Tesseract 文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别.Tesseract是一个用于文字识别的工具,我们结合Python使用可以很快的实现文字识别.但是在此之 ...

  3. python批量识别图片中文字_python实现中文图片文字识别--OCR about chinese text--tesseract...

    0.我的环境: win7 32bits python 3.5 pycharm 5.0 1.相关库 安装pillow: pip install pillow 安装tesseract: 自带了英文语言包, ...

  4. 深入学习使用ocr算法识别图片中文字的方法

    公司有个需求,简单点说需要从一张图片中识别出中文,通过python来实现,当然其他程序也行,只要能实现,而小编主要学习python,所以就提了python.一个小白在网上遨游了一天,终于找到一丝丝思绪 ...

  5. python批量识别图片中文字_Python识别图片中的文字

    一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...

  6. python批量识别图片中文字_如何用Python识别图片中的文字?

    一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...

  7. 一段比较浅显易懂的java识别pdf 文字及图片

    使用pdfbox及orc进行pdf文件的文字及图片的识别 pom设置相关依赖 <!--pdf相关依赖开始--><dependency><groupId>org.ap ...

  8. python使用aip库识别图片中文字

    一.获取百度智能云API的AppID / API Key / Secret Key 1.创建应用 百度智能云登录地址:https://login.bce.baidu.com/ 2.立即创建 3.得到A ...

  9. 识别图片中文字的三种方法/图片转文字

    一.钉钉 钉钉内置了很多小功能.打开手机钉钉,点击左下角的消息按钮,然后点击右上角的+号-扫一扫,点击拍图识字选中需要识别的文字即可. 二.QQ 打开手机QQ,点击右上角的+号-扫一扫之后,点击转文字 ...

最新文章

  1. 技术驰援抗疫一线, Python 线上峰会免费学!
  2. 实例分割最新最全面综述:从Mask R-CNN到BlendMask
  3. pandas对dataframe的数据列进行随机抽样(Random Sample of Columns):使用sample函数进行数据列随机抽样(有放回的随机抽样,replacement)
  4. Android Activtity Security
  5. css3魔方3乘3每层旋转_在玩魔方中学数学,原来魔方与矩阵还有这样的关系
  6. 输入数字自动找规律的软件_WPS2019 填充柄的顺序式填充、复制式填充、规律填充、自定义填充...
  7. SpringBoot 阶段总结
  8. 你真的了解iaas、PaaS、SaaS的区别吗?
  9. MTK 驱动开发(38)--- getevent 和 sendevent
  10. 古风祥云PNG免抠素材,喜欢吗?
  11. java知识总结-25
  12. 没有方案你抱怨;有了方案你会认真看吗?
  13. 基于stm32单片机外文文献_(强烈推荐)基于stm32的温度控制毕业论文设计
  14. 如何将KUX格式转换为MP4格式
  15. 电路分析超详细思维导图
  16. 浪潮提出“计算+”挖大数据商机
  17. 微信小程序-抖音/字节小程序
  18. 计算机二级中用函数制作工资条,教你用vlookup函数快速制作工资条
  19. 使用vue解决vs编辑器格式化分号逗号问题
  20. 前端开发全家桶:UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例

热门文章

  1. php项目排期表模板,最近在开发后台管理,想问下广告排期表怎么做?
  2. 关于将LIUNX下的图形化操作倾向WINDOWS的几个东西
  3. 华为手机不小心点了始终_华为手机有一个设置,用过一次就再也离不开了,你打开了吗?...
  4. 传奇微端配置不更新怎么办?
  5. Docker容器内存占用过高解决方法
  6. 从后端开发转大数据开发怎么样?
  7. 百度地图 鼠标绘制工具BUG修复(地图自动平移)
  8. 乡村爱情里的赵四;逗的大家笑尿裤子了
  9. scalac: Token not found...
  10. 06年底写的5年职业规划与珠海金山邮件面试题回复