• tess4j图片识别 和训练语言库提高图片识别率


    1.pom文件添加依赖

             <!-- 图形验证码识别https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
            <dependency>
                <groupId>net.sourceforge.tess4j</groupId>
                <artifactId>tess4j</artifactId>
                <version>4.5.4</version>
            </dependency>

    2.下载文件配置

    链接:https://pan.baidu.com/s/1BsFJ7uTl-AEzcUEfuV9ESw
    提取码:4wzp

    解压后显示

     3.进入dist文件,拷贝文件tess4j-3.4.8.jar到lib文件下

     4.将lib文件和tessdata文件方到项目根目录

     5.进入项目编码软件刷新项目目录

     6.testdata可以放到项目文件目录下

     7.被识别的图片存放位置

    新建目录,放在项目路径下

     

     8.编写识别代码

    package com.app.ocr;

    import net.sourceforge.tess4j.ITesseract;
    import net.sourceforge.tess4j.Tesseract;
    import net.sourceforge.tess4j.TesseractException;
    import java.io.File;
    import java.io.IOException;

    public class Main {
        public static void main(String[] args) {
            //  当前项目存放路径
            String path = "E://heduijiang//APP-test//APP-test//src//test//resources";
            // 要识别的图片
            File file = new File("E://heduijiang//APP-test//APP-test//src//test//resources//tupian//9188.png");
            ITesseract instance = new Tesseract();
            
            /**
             *  获取项目根路径,
             */
            File directory = new File(path);
            String courseFile = null;
            try {
                courseFile = directory.getCanonicalPath();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //设置训练库的位置
            instance.setDatapath(courseFile + "/tessdata");
            //chi_sim :简体中文, eng    根据需求选择语言库
            instance.setLanguage("eng");
            String result = null;
            try {
                long startTime = System.currentTimeMillis();
                result =  instance.doOCR(file);
                long endTime = System.currentTimeMillis();
                System.out.println("Time is:" + (endTime - startTime) + "ms");
            } catch (TesseractException e) {
                e.printStackTrace();
            }
            System.out.println("result: "+ result+"");
        }
    }

     9.在图片文件下放入要识别的图片

     10.代码路径指定图片的绝对路径输入图片名称,进行识别

    训练语言库适合自己的项目,自己编辑训练一个

    1.截图自己的项目的图片

     2.下载软件 jTessBoxEditorFX-2.3.1  和 tesseract-ocr-w64-setup-v5.0.0

    链接:https://pan.baidu.com/s/1PUlfRKC5Xt4SWeBjfGKVUA
    提取码:ad1q

     esseract-ocr-w64-setup-v5.0.0安装后配置环境变量,找到自己的安装的位置

    https://digi.bib.uni-mannheim.de/tesseract/下载tesseract版本完成安装。配置好环境变量,打开命令行窗口执行tesseract -v 看到相关版本信息,则表示安装配置成功。

    jTessBoxEditorFX-2.3.1 解压后显示

    双击启动 train.bat

     把图片文件夹放在此目录下,也可以在其它位置,这里我放到这个文件夹下

    1、生成tif和box文件

           可参照第一种方法生成。但这里介绍通过自定义图片使用jTessBoxEditor 合并tif

     

    全选图片

    输入名字num.font.exp0.tif

     

    生成了文件

     2、生成box文件

    在生成图片文件夹下,打开cmd命令框

     

    打开命令行执行命令tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox生成box文件,执行命令后输出如下:

    D:\wspace\tess4j-demo2\test-data\num>tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
    Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica
    Page 1
    Page 2
    Page 3
    Page 4

    生成文件 box

     

    3、字符配置文件font_properties

    在文件夹文件夹内,新建一个文本文件,名为font_properties,删掉.txt,用记事本打开,写入内容为:

    font 0 0 0 0 0

    准备环节

    • 将5个tif文件,num.font.exp0.tif,生成的num.font.exp0.box文件,还有font_properties文件放在同一个目录下,如上面已经在一个目录下了

    字符矫正

    • 打开 jTessBoxEditor>【BOX Editor】> 【Open】,打开num.font.exp0.tif;矫正【Char】上的字符
    • 操作截图:

     

     开始进行编写识别

    insert 添加

    delete 删除

    merge 合并

    split 分离 几乎不用此按钮

     

     只选择x值调

     

     依次循环,第一张完成后,切换第二张 最后点击保存

     所有图片编辑完后,点击 Save 保存即可

    8.执行批处理文件

    • 【注意】:执行该批处理文件前,先要目录下创建font_properties文件 ,也就是滴 5 步
    • 在目标目录下,新建一个txt文件,复制代码,重命名为 do.bat,直接更改后缀名就可以
    • 代码如下

     打开复制代码-保存

    echo Run Tesseract for Training..
    tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train

    echo Compute the Character Set..
    unicharset_extractor.exe num.font.exp0.box
    mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr


    echo Clustering..
    cntraining.exe num.font.exp0.tr

    echo Rename Files..
    rename normproto num.normproto
    rename inttemp num.inttemp
    rename pffmtable num.pffmtable
    rename shapetable num.shapetable  

    echo Create Tessdata..
    combine_tessdata.exe num.

    echo. & pause

    修改为 .bat文件

     

     

     双击do.bat文件前

      双击do.bat文件后

    9.拷贝 num.trainddata 文件

    • 最后将 num.trainddata 复制到 Tesseract-OCR 安装目录下的 tessdata 文件夹
    • 【注意】:这里是【Tesseract-OCR 安装目录下的 tessdata 文件夹】

     

     在图片文件下 输入cmd

    再次输入命令 tesseract num1.jpg num01 -l num

    num1.jpg 换成自己的图片

    遇到问题 mftraining.exe 停止运行

    解决方法 替换此文件就可以

     用上面安装的软件,找到此路径下这个文件直接替换就可

    找到本地文件位置

    下载可以启动的文件

    链接:https://pan.baidu.com/s/1NklBXlIi3W4D30O20lvXdw
    提取码:d2pb

    地址只把替换的文件拿出来了

     然后在执行 do.bat 就不报错了

    其他

    基于图片识别的识别率不高,所以我们一般先做图片的处理再进行识别。这个时候我们可以用到Tess4J专门提供的ImageHelper。里面分别有如下方法:

    getScaledInstance 放大图片
    getSubImage 截取图片
    convertImageToBinary 转二进制
    convertImageToGrayscale 将图像转换为灰度
    invertImageColor 反转图像颜色
    rotateImage 旋转影像

            //图片转图片流
            BufferedImage img = ImageIO.read(file);
            // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
            img = ImageHelper.convertImageToGrayscale(img);
            // 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
      // img = ImageHelper.convertImageToBinary(img);
            // 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
            img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);
    package com.app.ocr;

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;

    import javax.imageio.ImageIO;

    import net.sourceforge.tess4j.ITesseract;
    import net.sourceforge.tess4j.Tesseract;
    import net.sourceforge.tess4j.TesseractException;
    import net.sourceforge.tess4j.util.ImageHelper;

    public class Tess4jmain {
        public static void main(String[] args) throws IOException {
            // 识别图片的文件(修改为自己的图片路径)
            String imagePath = ClassLoader.getSystemResource("tupian/9188.png").getPath();
            if (imagePath.length()>0){
                imagePath = imagePath.substring(1);
            }
            System.out.println("imagePath:"+imagePath);
            File file = new File(imagePath);
            
            //图片转图片流
            BufferedImage img = ImageIO.read(file);
            // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
            img = ImageHelper.convertImageToGrayscale(img);
            // 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
            img = ImageHelper.convertImageToBinary(img);
            // 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
            img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);
            
            // 创建ITesseract对象
            ITesseract instance = new Tesseract();
            //设置训练库的位置
            String path = ClassLoader.getSystemResource("tessdata").getPath();
            if (path.length()>0){
                path = path.substring(1);
            }
            //打印一下路径,看有没有问题
            System.out.println("tessdata:"+path);
            instance.setDatapath(path);
            //chi_sim :简体中文, eng    根据需求选择语言库
            instance.setLanguage("eng");
            String result = null;
            try {
                long startTime = System.currentTimeMillis();
                result =  instance.doOCR(file);
                long endTime = System.currentTimeMillis();
                System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
            } catch (TesseractException e) {
                e.printStackTrace();
            }

            System.out.println("result: "+result);
        }
    }

  • 相关阅读:
    异步IO数据库队列缓存
    Python终端如何输出彩色字体
    pycharm导入本地py文件时,模块下方出现红色波浪线时如何解决
    Python中字典的详细用法
    基于pandas数据预处理基础操作
    进程、线程、协程篇
    面向对象编程进阶
    常用sign算法
    Excel随机生成数据2
    Oracle dbms_random随机数包详解
  • 原文地址:https://www.cnblogs.com/tiansc1/p/15773740.html
Copyright © 2020-2023  润新知