Tesseract-OCR安装与使用

Tesseract-OCR安装使用,通过java结合使用

随着人工智能的发展,生活中也逐渐出现了很多便捷高效的应用,人脸识别、证件识别认证、名片识别、车牌识别等,都在方便着我们的日常生活。同样,这些技术也可以为我们的日常业务处理流程提供智能高效的解决方案。日常交易、清算业务往来存在各种电子邮件、传真等单据,主要有确认成交单据、定存协议、对敲指令、银行间费用、网下中签公告、境外券商确认单等。这些单据需要人工识别提取要素录入系统,通过使用OCR技术,对单据图像内容进行识别、矫正,提取关键字段元素,与相关系统连接,能够减少人工手动录入,提高工作效率,降低人工录入失误。


光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。通常,图像信息通过扫描仪、照相机、电子传真软件等设备获取并存储在图像文件中,然后OCR软件读取、分析图像文件并通过字符识别提取出其中的字符串。

简单介绍到这里,开始本文的重点

Tesseract-OCR安装

Tesseract-OCR下载地址:https://github.com/UB-Mannheim/tesseract/wiki,下载tesseract安装包,我下载的4.0的Tesseract版本。

安装tesseract

1、双击tesseract-ocr-setup-4.0.0-alpha.20170804.exe运行
在这里插入图片描述
2、点击next
在这里插入图片描述
3、点击我同意,点击next
在这里插入图片描述
4、点击next
在这里插入图片描述
5、点击next
在这里插入图片描述

6、点击next,这地方我是默认安装位置
在这里插入图片描述
7、点击install,到这就开始安装了
在这里插入图片描述
8、点击next,到这就安装结束了
在这里插入图片描述

配置tesseract环境变量

此电脑–>右键–>点击属性–>高级系统设置
在这里插入图片描述
环境变量
在这里插入图片描述
系统环境变量–>path,添加Tesseract-OCR的路径位置
在这里插入图片描述
系统变量–>新建
变量名TESSDATA_PREFIX
变量值:C:\Program Files (x86)\Tesseract-OCR\tessdata 你Tesseract安装的位置我是默认的安装位置
这一步是添加Tesseract-OCR的语言库,语言库地址:https://github.com/tesseract-ocr/tessdata。你还可以根据实际情况去自己训练自己的语言
在这里插入图片描述
最后点击确定,应用到这里就环境变量就配置好了。

测试
  1. cmd打开dos窗口。tesseract -v
    在这里插入图片描述
    这一步就算安装成功了
  2. 使用
    先准备一张图片文件,如test.png
    在这里插入图片描述
    运行tesseract test.png 1 -l eng
    在这里插入图片描述
    发现会多一个1.txt文本,然后打开看一下就可以发现就是验证的文本
    在这里插入图片描述
    如下所示:
    在这里插入图片描述

Tesseract-ORC与java代码结合

不需要引入依赖之类的
创建OCRHelper帮助类

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class OCRHelper {

    private final String LANG_OPTION = "-l";
    private final String EOL = System.getProperty("line.separator");

    /**
     * Tesseract-OCR的安装路径
     */
    private String tessPath = "C:\\Program Files (x86)\\Tesseract-OCR";

    /**
     * @param imageFile   传入的图像文
     * @return 识别后的字符串
     */
    public String recognizeText(File imageFile) throws Exception {
        /**
         * 设置输出文件的保存的文件目录,创建output文件夹
         */
        File outputFile = new File(imageFile.getParentFile(), "output");

        StringBuffer strB = new StringBuffer();
        List<String> cmd = new ArrayList<String>();

       cmd.add(tessPath + "\\tesseract");

        cmd.add("");
        cmd.add(outputFile+"\\"+outputFile.getName());
        cmd.add(LANG_OPTION);
//        cmd.add("chi_sim");// 切换中文识别语言或者你自己训练的语言
        cmd.add("eng");

        ProcessBuilder pb = new ProcessBuilder();

        pb.directory(new File(tessPath));
        cmd.set(1, imageFile.getParentFile()+"\\"+imageFile.getName());
        pb.command(cmd);
        pb.redirectErrorStream(true);


        long startTime = System.currentTimeMillis();
        System.out.println("开始时间:" + startTime);
        Process process = pb.start();/**/
        // tesseract.exe 1.jpg 1 -l chi_sim
        //不习惯使用ProcessBuilder的,也可以使用Runtime,效果一致
//        System.out.println(imageFile.getName());
//        System.out.println(imageFile.getParentFile());
//        Process exec = Runtime.getRuntime().exec(tessPath+"\\"+"tesseract.exe " + imageFile.getParentFile()+"\\"+imageFile.getName() + " 1 -l eng");
        /**
         * the exit value of the process. By convention, 0 indicates normal
         * termination.
         */
        int w = process.waitFor();
//        int w = exec.waitFor();
        if (w == 0)// 0代表正常退出
        {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    new FileInputStream(outputFile+"\\"+outputFile.getName()+".txt"),
                    "UTF-8"));
            String str;
            while ((str = in.readLine()) != null) {
                strB.append(str).append(EOL);
            }
            in.close();

            long endTime = System.currentTimeMillis();
            System.out.println("结束时间:" + endTime);
            System.out.println("耗时:" + (endTime - startTime) + "毫秒");
        } 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 recognize the image or its selected region.";
                    break;
                case 31:
                    msg = "Unsupported image format.";
                    break;
                default:
                    msg = "Errors occurred.";
            }
            throw new RuntimeException(msg);
        }
        // 删除生成的文件
        new File(outputFile+"\\"+outputFile.getName()+".txt").delete();
        return strB.toString().replaceAll("\\s*", "");
    }
}

主入口类来运行

import java.io.File;
import java.io.IOException;

public class TestOCR {
    public static void main(String[] args) {
        try {
            //图片文件:此图片是需要被识别的图片
            File file = new File("E:\\vscode\\canvas\\img\\test.png");
            /*String recognizeText = new OCRHelper().recognizeText(file);
            System.out.print(recognizeText + "\t");*/
            System.out.println("begin.........");
            String recognizeText1 = new OCRHelper().recognizeText(file);
            System.out.print(recognizeText1+"\t");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最后运行结果如下:
在这里插入图片描述
是不是很简单。与java结合代码就这么多,是不是很so easy。实际操作中会遇到很多奇奇怪怪的实际开发问题,所以咱们针对专门的需求,需要训练自己需要的一个语言库,以提高识别率,还有比如图片去二值化、去除图片干扰线,灰度化等针对图片,来提图片高识别率。

比如我遇到爬虫爬取数据,登录就有验证码,但客户就要这个网站的数据,怎么办破解呗,咱把图片验证码识别出来不就可以了。登录获取到cookie然后再爬取。

如何提高验证码识别率?下篇博客讲吧,这一篇已经不少,我怕没耐心看完(●’◡’●),不是故意写两篇的

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值