tess4J 安装使用

tess4J 安装使用直接引用maven测试报错主要原因是引入不了dlljava.lang.UnsatisfiedLinkError:找不到指定的模块。 atcom.sun.jna.Native.open(NativeMethod) atcom.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:288) atcom.sun.jna.Na…

大家好,又见面了,我是你们的朋友全栈君。

直接引用maven测试报错

主要原因是引入不了dll

java.lang.UnsatisfiedLinkError: 找不到指定的模块。

	at com.sun.jna.Native.open(Native Method)
	at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:288)
	at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:427)
	at com.sun.jna.Library$Handler.<init>(Library.java:179)
	at com.sun.jna.Native.loadLibrary(Native.java:569)
	at com.sun.jna.Native.loadLibrary(Native.java:544)
	at net.sourceforge.tess4j.util.LoadLibs.getTessAPIInstance(LoadLibs.java:85)
	at net.sourceforge.tess4j.TessAPI.<clinit>(TessAPI.java:42)
	at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:427)
	at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:223)
	at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:195)
	at TestOcr.main(TestOcr.java:23)

 

官网

http://tess4j.sourceforge.net/

 

下载包

https://sourceforge.net/projects/tess4j/

 

下载解压后截图

 

tess4J 安装使用

 

 

 lib 包下面有 libtesseract3051.dll

 

将这个文件放到 目录 C:\Windows\System32 下面

这是个老版本, 实际上应该安装

参考 https://blog.csdn.net/gs80140/article/details/103938651

 

安装后,使用java程序调用就可以了???

在Linux使用了3.4.8的版本报乱码, 换新版本试试, 新版本 411的也一样的问题

一堆问题, 跑通了得到的文字也是乱的, 没有的文字乱七八糟的文字都出来了, 但是使用原生的 Tesseract 命令行解析出来的文字就还可以, 一直处在奔溃的边缘,但是没有放弃, 看到了一个easyocr的项目

https://github.com/ushelp/EasyOCR

不过此项目已经找不到开源的代码了,号称很厉害, 于是搜索了以前的旧的代码

https://github.com/HighCWu/EasyOCR 这个是找回的历史版本, 在这个版本中看到了 maven依赖, 于是立即尝试

<dependency>
 	<groupId>cn.easyproject</groupId>
 	<artifactId>easyocr</artifactId>
 	<version>3.0.4-RELEASE</version>
</dependency>

<dependency>
     <groupId>cn.easyproject</groupId>
     <artifactId>easyocr-linkbold-plugin</artifactId>
     <version>3.0.3-RELEASE</version>
</dependency>

参考代码

EasyOCR e=new EasyOCR();
//直接识别图片内容
System.out.println(e.discern("images/demo_eurotext.png"));  

直接报错, 但是分析一下源码发现,原来这个项目也是使用的

下面的代码还没有尝试过, 下面的代码应该可以使用, 原理已经掌握, 就是调用命令嘛, 这个也是我期望的结果

EasyOCR ocr = new EasyOCR();

System.out.println("###### 中文会议通知内容识别 ######");
ocr.setAmendPath("amend_chi.txt"); // 中文识别修正
ocr.setLanguage(Language.CHI_SIM); // 中文语言
String res=ocr.discern("images/bank/notice.tif");
System.out.println(res);

System.out.println("###### 多语言混合识别 ######");
ocr.setLanguage(Language.multiLanguage(Language.ENG,Language.CHI_SIM)); // 多语言识别
String res2=ocr.discern("images/bank/bill2.tif");
System.out.println(res2);

System.out.println("###### 基于ETD模板的中文银行票据识别 ######");
ocr.setLanguage(Language.CHI_SIM); // 中文识别
ocr.setTextMode(TextMode.UNIFORM_TEXT); // 统一大小
List<String> res3=ocr.discernByTemplate("images/bank/bill3.jpg", "images/bank/bill.etd", ImageType.BILL_NORMAL);
System.out.println(res3);

System.out.println("###### 带图片的清理数字内容识别 ######");
ocr.setLanguage(Language.ENG); // 英文识别
ocr.setCharList("0123456789"); // 字符限定API
ocr.setTextMode(TextMode.SINGLE_LINE_TEXT); // 单行文本识别
String res4=ocr.discernAutoCleanImage("images/bank/example4.jpg",ImageType.TEXT_BOLD_BLAK);
System.out.println(res4);

 

经过上面的分析,开始写代码,直接调用命令, 这个命令的调用, windows机器,Linux机器分别安装最新版本的Tesseract并且确保在命令行里面能直接使用命令 tesseract ,语言包也相应放对位置即可

分享一下直接调用命令的程序, 再次感谢EasyOCR的启发, tess4j的乱码问题留待以后吧, 直接调用命令的效率还是挺快的, 比用tess4j快多了, 在windows机器上, 识别一个图片,tess4j要10几秒, 命令行1-2秒就出结果了,而且还不乱

@NacosValue("${tesseract.execute.dir}")
    private String tesseractExecuteDir = "D:/data";

    /**
     * 此时本机要安装tesseract,并且放入path中,执行命令可以直接运行这个命令
     * @return
     */
    public String doTesseractOCR(byte[] bytes) throws Exception
    {
        //定义根目录
        File execFolder = new File(tesseractExecuteDir);
        String currentIndex = UUID.randomUUID().toString();
        String imgName = currentIndex+".jpg";
        File imageFile = new File(execFolder,imgName);
        File resultFile = null;
        try
        {
            //将bytes数组写入文件
            FileImageOutputStream imageOutput = new FileImageOutputStream(imageFile);
            imageOutput.write(bytes, 0, bytes.length);
            imageOutput.close();

            // 存放命令行参数的数组
            List<String> cmd = new ArrayList<>();
            ProcessBuilder pb = new ProcessBuilder();
            pb.directory(execFolder);
            cmd.add("tesseract");
            cmd.add("-l");
            cmd.add("chi_sim");
            cmd.add(imgName);
            cmd.add(currentIndex);
            // 执行命令行
            pb.command(cmd);
            // 通知进程生成器是否合并标准错误和标准输出,把进程错误保存起来。
            pb.redirectErrorStream(true);
            // 开始执行进程
            Process process = pb.start();
            // 当前进程停止,直到process停止执行,返回执行结果.
            int w = process.waitFor();
            // 0代表正常退出
            if (w == 0)
            {
                resultFile = new File(execFolder,currentIndex+".txt");
                if(resultFile.exists())
                {
                    return FileUtil.readUtf8String(resultFile);
                }
            }
            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 accessing files. There may be wrong filename.错误码:"+w;
                }
                throw new Exception(msg);
            }
        }
        finally {
            FileUtil.del(imageFile);
            FileUtil.del(resultFile);
        }
        return "";
    }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130159.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 区块链与联邦学习的研究

    区块链与联邦学习的研究本文分别介绍了区块链与联邦学习的研究现状、架构和运行原理、主要技术及局限性,并针对区块链与联邦学习所存在的问题,通过分析区块链与联邦学习各自的特点,探讨了如何将区块链与联邦学习进行融合互补,介绍了两种融合模型及其应用场景。1区块链概述1.1 区块链的研究现状2008年10月,化名为“中本聪”的学者在密码学论坛上公开了《比特币:一种点对点的电子现金系统》一文[1],提出了利用PoW和时间戳机制构造交易区块的链式结构,剔除了可信第三方,实现了去中心化的匿名支付。比特币于2009年1月上线并发布创世块,.

    2022年9月6日
    2
  • 如何从零开始学android?

    如何从零开始学android?不知不觉进入软件开发这一行业已经8年了,回想起刚毕业在深圳一个月拿着2000的工资,还要在休息时间自学android,感觉那段时光真的是大学毕业后最充实的一段时光了;努力总会有结果的,第二年涨到5000,第三年跳槽回郑州给了我7500,主要是离家近,父母年纪大了,给的钱少点无所谓,起码能经常回家看看。回忆到此结束,之前看到有人在悟空问答提问怎么从零开始学android这个问题,但是限于爪机无力…

    2022年6月13日
    33
  • Qt学习之QListWidget删除Item

    Qt学习之QListWidget删除Item将QListWidgetItem从QListWidget列表中删除有两种方法可以做到,但也要根据自己的需要进行选择。第一种是QListWidgetItem*takeItem(introw);使用此方法需要知道删除的是第几个Item,并且返回删除的Item指针。第二种是inlinevoidremoveItemWidget(QListWidgetItem*item);需要知道删除

    2022年5月3日
    540
  • dubbo框架RPC过程详解「建议收藏」

    转载地址:http://www.cnblogs.com/LBSer/p/4853234.html你应该知道的RPC原理  在学校期间大家都写过不少程序,比如写个helloworld服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。  而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的

    2022年4月11日
    51
  • 深入理解卷积层,全连接层的作用意义「建议收藏」

    深入理解卷积层,全连接层的作用意义「建议收藏」有部分内容是转载的知乎的,如有侵权,请告知,删除便是,但由于是总结的,所以不一一列出原作者是who。再次感谢,也希望给其他小白受益。首先说明:可以不用全连接层的。理解1:卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。理解2:从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会制度”。卷积核的个数相当于候选人,…

    2022年9月19日
    0
  • Cmd命令 查看端口被占用

    Cmd命令 查看端口被占用Cmd命令查看端口被占用1)第一步  打开cmd命令窗口,输入命令:netstat-ano|findstr输入端口号2)第二步  继续输入命令:tasklist|findstr第一步查询到的进程号3)第三步  根据第二步执行结果,打开任务管理器,将相应进程干掉即可…

    2022年5月19日
    136

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号