文字提取(Java+Tesseract_OCR)

开发环境

系统: windows 11
jdk: 1.8
框架: spring boot 2.1.4 + maven
工具: idea

Tesseract 安装

相关链接

官方网站:https://github.com/tesseract-ocr/tesseract
官方文档:https://github.com/tesseract-ocr/tessdoc
语言包地址:https://github.com/tesseract-ocr/tessdata
下载地址:https://digi.bib.uni-mannheim.de/tesseract/
在我的资源里面也提交了5.0 windows 的安装包.(我想免费的,官方没有这个选择)
64位: https://download.csdn.net/download/qq_35885175/68236012
32位: https://download.csdn.net/download/qq_35885175/68235937

安装

  1. 双击 选择语言点击OK
    在这里插入图片描述

  2. 直接next(下一步)
    在这里插入图片描述

  3. 日常同意协议
    在这里插入图片描述

  4. 选择给谁安装(看自己需要,我的是个人电脑)
    在这里插入图片描述

  5. 接下来是选择语言包
    最后那两个框就是下载语言包的不建议选择(很慢,除非梯子,下面会有教程扩展语言包的)
    在这里插入图片描述

  6. 选择安装目录
    在这里插入图片描述

  7. next,等待安装完成
    (有一个选择是否添加注册表的,我忘记截图了,默认next 干就完了)
    在这里插入图片描述

  8. 安装完成(结束)
    在这里插入图片描述

配置环境变量

这个步骤对于大家来说就很简单了

  1. 电脑设置(高级环境变量)
    windows11
    在这里插入图片描述
    windows 10(windows server 凑合看吧)
    在这里插入图片描述
  2. 点击环境变量
    在这里插入图片描述
  3. 系统变量中找到PATH
    (用户变量也可,不能用 别找我)
    在这里插入图片描述
  4. 点击新建,选择路径
    在这里插入图片描述
  5. 大概就是这个样,点击确定就行了
    在这里插入图片描述

检查时候安装成功

万能的cmd来了

  1. win+R 输入cmd
    在这里插入图片描述
  2. 小黑框输入 tesseract -v在这里插入图片描述
  3. 看到了吗,我们安装的版本
    在这里插入图片描述

扩展语言包

上面那个链接可以跳转github里面下载(传送门)
csdn我上传的:https://download.csdn.net/download/qq_35885175/68245426
这个东西就是简体中文的啦
在这里插入图片描述
go:
把下载好的文件放入安装目录中,就完成了
在这里插入图片描述
测试时候扩展是否成功
小黑框(cmd) 输入: tesseract --list-langs
在这里插入图片描述
搞定

Java代码(上小菜)

1.POM文件

 <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>5.0.0</version>
 </dependency>

下载不成功的话 多切换几个 version
jar包链接 : https://download.csdn.net/download/qq_35885175/68256292
或者下载 这个我上传的 直接按照目录扔到仓库

2.ImageIOHelper代码

package com.lk.integutils.utils;

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.github.jaiimageio.plugins.tiff.TIFFImageWriteParam;

public class ImageIOHelper {

    //设置语言
    private Locale locale=Locale.CHINESE;

    //自定义语言构造的方法
    public ImageIOHelper(Locale locale){
        this.locale=locale;
    }
    //默认构造器Locale.CHINESE

    public ImageIOHelper(){
    }


    /**
     * 创建临时图片文件防止损坏初始文件
     * @param imageFile
     * @param imageFormat like png,jps .etc
     * @return TempFile of Image
     */
    public File createImage(File imageFile, String imageFormat) throws IOException {

        //读取图片文件
        Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);
        ImageReader reader = readers.next();
        //获取文件流
        ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
        reader.setInput(iis);
        IIOMetadata streamMetadata = reader.getStreamMetadata();

        //设置writeParam
        TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
        tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
        //设置可否压缩

        //获得tiffWriter和设置output
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");
        ImageWriter writer = writers.next();


        BufferedImage bi = reader.read(0);
        IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
        File tempFile = tempImageFile(imageFile);
        ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);

        writer.setOutput(ios);
        writer.write(streamMetadata, image, tiffWriteParam);

        ios.close();
        iis.close();
        writer.dispose();
        reader.dispose();

        return tempFile;
    }

    /**
     * 给tempfile添加后缀
     * @param imageFile
     * @throws IOException
     */
    private File tempImageFile(File imageFile) throws IOException {
        String path = imageFile.getPath();
        StringBuffer strB = new StringBuffer(path);
        strB.insert(path.lastIndexOf('.'),"_text_recognize_temp");
        String s=strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");
        //设置文件隐藏
        Runtime.getRuntime().exec("attrib "+"\""+s+"\""+" +H");
        return new File(strB.toString());
    }

}

3. OCRUtil代码

package com.lk.integutils.utils;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import org.jdesktop.swingx.util.OS;

public class OCRUtil  {
    private final String LANG_OPTION = "-l";
    //英文字母小写l,并非阿拉伯数字1

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

    /**
     * ocr的安装路径
     */
    private String tessPath =  "D:\\Utils\\Tesseract-OCR";



    public OCRUtil(String tessPath,String transFileName){
        this.tessPath=tessPath;
    }

    //OCRUtil的构造方法,默认路径是"C://Program Files (x86)//Tesseract-OCR"

    public OCRUtil(){     }

    public String getTessPath() {
        return tessPath;
    }
    public void setTessPath(String tessPath) {
        this.tessPath = tessPath;
    }
    public String getLANG_OPTION() {
        return LANG_OPTION;
    }
    public String getEOL() {
        return EOL;
    }


    /**
     * @return 识别后的文字
     */
    public String recognizeText(File imageFile,String imageFormat)throws Exception{
        File tempImage = new ImageIOHelper().createImage(imageFile,imageFormat);
        return ocrImages(tempImage, imageFile);
    }

    /**
     *  可以自定义语言
     */
    public String recognizeText(File imageFile,String imageFormat,Locale locale)throws Exception{
        File tempImage = new ImageIOHelper(locale).createImage(imageFile,imageFormat);
        return ocrImages(tempImage, imageFile);
    }

    /**
     * @param
     * @param
     * @return 识别后的内容
     * @throws IOException
     * @throws InterruptedException
     */
    private String ocrImages(File tempImage,File imageFile) throws IOException, InterruptedException{

        //设置输出文件的保存的文件目录,以及文件名
        File outputFile = new File(imageFile.getParentFile(),"test");
        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("equ");
        //英语包
        cmd.add("eng");


        //创建操作系统进程
        ProcessBuilder pb = new ProcessBuilder();
        //设置此进程生成器的工作目录
        pb.directory(imageFile.getParentFile());
        cmd.set(1, tempImage.getName());
        //设置要执行的cmd命令
        pb.command(cmd);
        //设置后续子进程生成的错误输出都将与标准输出合并
        pb.redirectErrorStream(true);

        long startTime = System.currentTimeMillis();
        System.out.println("开始时间:" + startTime);
        //开始执行,并返回进程实例
        Process process = pb.start();
        //最终执行命令为:tesseract 1.png test -l chi_sim+equ+eng
        // 输入输出流优化
//        printMessage(process.getInputStream());
//        printMessage(process.getErrorStream());
        int w = process.waitFor();
        //删除临时正在工作文件
        tempImage.delete();
        if(w==0){
            // 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();

            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 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().replaceAll("\\s*", "");
    }


    private static void printMessage(final InputStream input) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Reader reader = new InputStreamReader(input);
                BufferedReader bf = new BufferedReader(reader);
                String line = null;
                try {
                    while ((line = bf.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

4.TestOcr 测试代码

package com.lk.integutils.utils;

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

public class TestOcr {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //输入图片地址
        String path = "d://1640144341(1).png";
        try {
            String valCode = new OCRUtil().recognizeText(new File(path), "png");
            System.out.println(valCode);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

结尾

效果不咋的,需要调教

更新

强烈希望大家使用 4.0版本 训练的时候问题少,安装包已上传 教程一样
4.0链接:https://download.csdn.net/download/qq_35885175/69815695

参考文章

mall4j: https://segmentfault.com/a/1190000039362377
SyKay: https://www.jianshu.com/p/f7cb0b3f337a
训练文章:https://blog.csdn.net/qq_31112205/article/details/100159963

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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、付费专栏及课程。

余额充值