标签: tess4j

在进行字符识别之前使用OpenCV进行图像预处理(tesseract)

我正在尝试开发用于车牌识别的简单PC应用程序(Java + OpenCV + Tess4j).图像并不是很好(进一步说它们会很好).我想为tesseract预处理图像,而我却坚持检测车牌(矩形检测).

我的步骤:

1)源图像

真实的形象

Mat img = new Mat();
img = Imgcodecs.imread("sample_photo.jpg"); 
Imgcodecs.imwrite("preprocess/True_Image.png", img);
Run Code Online (Sandbox Code Playgroud)

2)灰度

Mat imgGray = new Mat();
Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("preprocess/Gray.png", imgGray);
Run Code Online (Sandbox Code Playgroud)

3)高斯模糊

Mat imgGaussianBlur = new Mat(); 
Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(3, 3),0);
Imgcodecs.imwrite("preprocess/gaussian_blur.png", imgGaussianBlur);  
Run Code Online (Sandbox Code Playgroud)

4)自适应阈值

Mat imgAdaptiveThreshold = new Mat();
Imgproc.adaptiveThreshold(imgGaussianBlur, imgAdaptiveThreshold, 255, CV_ADAPTIVE_THRESH_MEAN_C ,CV_THRESH_BINARY, 99, 4);
Imgcodecs.imwrite("preprocess/adaptive_threshold.png", imgAdaptiveThreshold);
Run Code Online (Sandbox Code Playgroud)

这应该是第5步,即检测板区域(现在可能甚至没有偏斜).

我使用Paint从图像(第4步之后)开始需要区域,并得到:

板块区域

然后我做了OCR(通过tesseract,tess4j):

File imageFile = new File("preprocess/adaptive_threshold_AFTER_PAINT.png");
ITesseract instance = new Tesseract();
instance.setLanguage("eng");
instance.setTessVariable("tessedit_char_whitelist", "acekopxyABCEHKMOPTXY0123456789");
String result = instance.doOCR(imageFile); 
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

并得到(足够好?)结果 - "Y841ox EH"(几乎是真的)

如何在第4步后检测并裁剪板区?我是否需要在1-4步中进行一些更改(改进)?希望看到一些通过Java …

java opencv tesseract anpr tess4j

14
推荐指数
1
解决办法
1万
查看次数

Tesseract - 错误net.sourceforge.tess4j.Tesseract - null

创建了一个使用Tesseract的java应用程序,以便将给定的图像或pdf转换为字符串格式,当在我的机器上运行它作为使用junit的单元测试时,它运行良好但运行完整系统时这是一个由tomcat运行的restFul API接收图像并运行Tesseract它给我以下错误:

23:22:36.511 [http-nio-9999-exec-3]错误net.sourceforge.tess4j.Tesseract - null java.lang.NullPointerException:null at net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Png(PdfUtilities.java: 107)在net.sourceforge.tess.tess.tess上,net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Tiff(PdfUtilities.java:48)at net.sourceforge.tess4j.util.ImageIOHelper.getIIOImageList(ImageIOHelper.java:343)at net.sourceforge.tess4j.Tesseract.doOCR (tesseract.java:213)位于com.tapd.server.api.handlers.IRSHandler的ocr.OcrUtil.getString(OcrUtil.java:54)的net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:197).在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)的com.tapd.server.api.WebAPIService.updateParentIrsForm(WebAPIService.java:250)上的uploadIRSImage(IRSHandler.java:65) )atg.glassfish.jersey.server.model.internal.ResourceMethodInv中java.lang.reflect.Method.invoke(未知来源)的sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)位于org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher $ 1.run(AbstractJavaResourceMethodDispatcher.java:144)org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher的ocationHandlerFactory $ 1.invoke(ResourceMethodInvocationHandlerFactory.java:81).在org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider $ responseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch上调用(AbstractJavaResourceMethodDispatcher.java:161)在org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)的org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)org上的AbstractJavaResourceMethodDispatcher.java:99) org.glassfish.jersey.server.ServerRuntime $ 2.run(ServerR)中的.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)untime.java:309)org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:271)org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:267)at org.glassfish .gersey.internal.Errors.process(Errors.java:315)位于org.glassfish.jersey.internal.Errors.process(Errors.java:297)org.glassfish.jersey.internal.Errors.process(Errors.java) :267)位于org.glassfish.jersey的org.glassfish.jersey.jersey.服务器上的org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292)的org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317). server.ApplicationHandler.handle(ApplicationHandler.java:1139)org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:460)org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)在Org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334)org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationF ilterChain.java:230)org.apache上的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)中的.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java) :198)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522)org.apache.catalina.core. org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)上的StandardHostValve.invoke(StandardHostValve.java:140)位于org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)的org org.apache.ca上的.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110)atg.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)中的talina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) at org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:785)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1425)at org.apache.tomcat.util .net.SocketProcessorBase.run(SocketProcessorBase.java:49)位于org.apache.tomcat的java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知来源)的java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源). java.lang.Thread.run(2016年1月14日23:22:36,512)[错误] java.lang.NullPointerException

我的猜测是tessdata文件夹不在正确的位置,当打包到Jar并由tomcat运行时,它是错位的,但我无法弄清楚它应该位于何处,我已经仔细检查了所有Jars正确部署.

编辑:因此,当Tesseract在远程服务器(如AWS S3)上时,它似乎无法处理路径,所以问题是为什么?以及如何允许它使用S3的路径?(是的,文件是公开的)

java ocr tomcat tesseract tess4j

11
推荐指数
2
解决办法
2806
查看次数

Tessj4 - 打开数据文件./tessdata/eng.traineddata时出错

我在Tomcat 9中的Web应用程序中遇到此问题:

打开数据文件时出错./tessdata/eng.traineddata请确保将TESSDATAPREFIX环境变量设置为"tessdata"目录的父目录.加载语言'eng'失败Tesseract无法加载任何语言!

我从Tess4J 3.0.4 zip创建文件夹C:\ Tess4J,子文件夹:

  • DIST
    • tess4j-3.0.jar
  • LIB
    • LIBS
  • nbproject文件
  • SRC
  • tessdata
    • 用语言下载ZIP并在此处提取
  • 测试

在catalina.properties中,我添加:

  • C:/Tess4J/dist/tess4j-3.0.jar,C:/ Tess4J/lib中

在环境中我尝试添加两者,但不起作用:

  • TESSDATA_PREFIX - > C:/ Tess4J
  • TESSDATA_PREFIX - > C:/ Tess4J/tessdata

然后我调用我的servlet whit doOCR方法,我有错误.

你可以帮帮我吗?

java tess4j

8
推荐指数
1
解决办法
7946
查看次数

未应用Tesseract用户模式

我想在这张图片上做OCR.在此输入图像描述 这是预定义的格式.即前五个将是字符,然后接下来的四个将是数字,最后一个将是字符.

当我执行以下命令

$ tesseract in.png stdout
Run Code Online (Sandbox Code Playgroud)

我输出为BDVPD474SQ

所以,我去了用户模式.我创建了一个名为bazaar的文件(在目录/ usr/share/tesseract-ocr/tessdata/configs中)(其内容如下)

load_system_dawg     F
load_freq_dawg       F
user_patterns_suffix user-patterns
Run Code Online (Sandbox Code Playgroud)

我还在目录/ usr/share/tesseract-ocr/tessdata中创建了一个名为eng.user-patterns的文件(其内容如下)

\A\A\A\A\A\d\d\d\d\A
Run Code Online (Sandbox Code Playgroud)

不过,我得到了同样的结果

$ tesseract in.png stdout bazaar
BDVPD474SQ
Run Code Online (Sandbox Code Playgroud)

我做错了什么?Tess4j有没有人完成这个?

ocr tesseract tess4j

6
推荐指数
1
解决办法
1568
查看次数

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

我刚刚从http://tess4j.sourceforge.net/下载了 Tess4J并将其导入到 netbeans 中。我正在关注这个网址,我正确地遵循了每一步,但是当我尝试执行时,我遇到了以下错误。

错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: The specified module could not be found.

    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.Native.open(Native.java:1759)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
    at com.sun.jna.Library$Handler.<init>(Library.java:147)
    at com.sun.jna.Native.loadLibrary(Native.java:412)
    at com.sun.jna.Native.loadLibrary(Native.java:391)
    at net.sourceforge.tess4j.util.LoadLibs.getTessAPIInstance(LoadLibs.java:75)
    at net.sourceforge.tess4j.TessAPI.<clinit>(TessAPI.java:42)
    at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:367)
    at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:280)
    at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:212)
    at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:196)
    at recognizer.Recognizer.main(Recognizer.java:17)
Java Result: 1
Run Code Online (Sandbox Code Playgroud)

我搜索并发现人们建议更新到 Visual Studio 2013 的Visual Visual C++ Redistributable Packages,我这样做了,但结果没有帮助,我仍然遇到同样的问题。我不知道我做错了什么下面是我的代码。

代码:

import java.io.*;
import net.sourceforge.tess4j.*;

public class Recognizer {
public static void main(String[] args) {
File …
Run Code Online (Sandbox Code Playgroud)

java ocr tesseract tess4j

6
推荐指数
1
解决办法
5361
查看次数

如何在自定义数据集上微调超正方体?

我知道这个问题可能不是一个新问题,但训练/微调超正方体是最难的部分之一,我永远找不到任何可以正确解释它的文章。所有的教程或文档都没有人完整地解释它,浏览它们会提出更多的问题而不是答案。

所以我真的希望我能在几个方面得到一些澄清,如果可能的话,用外行的话来说。

我有一些这样的简历,link1 link2 link3

这些是一些复杂的简历,训练它们需要 tesseract 了解是否从左到右提取文本,特别是在两列简历中,它需要解析一列文本,然后解析另一列文本。

现在,我如何为此目的微调超正方体,因为在尝试时它没有正确解析它?

有人说我需要创建一个包含图像中每个字符坐标的框文件,一些文档说您需要一个图像文件和一个包含文本的同名文本文件?这里哪个是正确的格式?这比我这样的问题有优势。

现在,如果我需要获取每个字符坐标,我可以使用像 google Vision api 这样的在线 ocr 平台来生成此类数据,因为手动注释它们永远不是一件容易的任务。即使谷歌视觉 API 返回文本和每个字符边界坐标,它可能不是 tesseract 正在寻找的坐标?

另外,tesseract 是否可以解决我的问题,或者我是否需要构建一个单独的 ocr 模型(我可以利用的任何 github 链接或预训练模型)?

请对我的问题提供任何形式的帮助,我已经到处寻找答案几个星期了,但没有运气。请帮帮我。

编辑:期待更详细的答案。

tesseract python-tesseract tess4j tesseract.js

6
推荐指数
0
解决办法
1263
查看次数

Tess4J - 在资源路径中找不到本机库 (linux-x86-64/libtesseract.so)

我正在使用 Tess4J(Tesseract 的 JNA 包装器),并尝试tess.doOCR(myFile)从单页 PDF 调用 OCR 文本。

我安装了 GhostScript(通过使用yum install ghostscript),gs -h工作正常。

我的应用程序服务器正在使用64-bit JVM,并且我有gsdll64.dll,以及 64 位 tesseract dll 的liblept168.dlllibtesseract302.dll在类路径中。

tess.doOCR(myFile)调用时,会记录以下内容:

GPL Ghostscript 8.70 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Run Code Online (Sandbox Code Playgroud)

但随后就到此为止了。该计划不再继续。

更新 -

看起来真正的问题来自这个错误:

java.lang.UnsatisfiedLinkError: Unable to load library 'tesseract': Native …

pdf tesseract ghostscript tess4j

5
推荐指数
2
解决办法
2万
查看次数

Tesseract For Java 设置 Tessdata_Prefix 为可执行 jar

该项目的最终目标是获取 jar 并将其放入使用 tesseract 的目录中,并输出结果目录和输出 txt 文件。不过,我在使用超正方体时遇到了一些问题。我正在 Java 中使用 tess4j 和 Maven,我想将我的代码放入可执行 jar 中。该项目作为桌面应用程序运行良好,但每当我尝试使用java -jar fileName.jar(导出到 jar 后)运行时,它都会给我错误

Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory
Failed loading language 'eng'
...
Run Code Online (Sandbox Code Playgroud)

我在网上查找,但无法真正找到如何为 jar 设置超正方体并获得正确的路径。现在我使用 maven 并在我的 pom 文件(tess4j -v 3.0)中有 Tesseract 依赖项,并且我的项目中有 tessdata。

我对 Maven 和 jar 文件相当陌生,以前从未使用过 tesseract,但据我从互联网上可以看出,我设置正确。

有谁知道如何使 tess4j 指向我项目中的 tessdata 目录并拥有动态路径,以便我可以在多台计算机和位置上移动使用它?

这就是我所说的 Tesseract

    Tesseract instance = new Tesseract();
    instance.setDatapath("src/main/resources");
    String result = instance.doOCR(imageFile);
    String fileName = …
Run Code Online (Sandbox Code Playgroud)

java tesseract executable-jar maven tess4j

5
推荐指数
1
解决办法
8514
查看次数

Tess4J:"无效的调用约定63",尽管版本正确

我尝试使用Tess4JLinux上的以下代码(Ubuntu 16 Xenial)进行OCR并输出为PDF.

public void testOcr() throws Exception {
    File imageFile = new File("/projects/de.conradt.core/tessdata/urkunde.jpg");
    ITesseract instance = new Tesseract1();  // tried both Tesseract() and Tesseract1()

    // File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Maven build bundles English data
    // instance.setDatapath(tessDataFolder.getParent());
    instance.setDatapath("/projects/de.conradt.core/tessdata");
    instance.setLanguage("deu");

    try {
        String result = instance.doOCR(imageFile);
        System.out.println(result);
    } catch (TesseractException e) {
        System.err.println(e.getMessage());
    }

    List<ITesseract.RenderedFormat> list = new ArrayList<ITesseract.RenderedFormat>();
    list.add(ITesseract.RenderedFormat.PDF);
    File pdfFile = new File("/projects/de.conradt.core/tessdata/urkunde.pdf");
    instance.createDocuments(pdfFile.getAbsolutePath(), "/projects/de.conradt.core/tessdata/urkunde", list);
}
Run Code Online (Sandbox Code Playgroud)

最后一行

        instance.createDocuments(pdfFile.getAbsolutePath(), "/projects/de.conradt.core/tessdata/urkunde", …
Run Code Online (Sandbox Code Playgroud)

tesseract tess4j

5
推荐指数
1
解决办法
786
查看次数

JAVA Tess4j doOCR()不工作,异常"内存访问无效"

我在eclipse的动态web项目中工作,我创建了一个包含以下内容的TesseractOCR类:

public class TesseractOCR {

    public TesseractOCR()
    {
    }

    public String doOCR(String file)
    {
         System.setProperty("jna.library.path", "32".equals(System.getProperty("sun.arch.data.model")) ? "lib/win32-x86" : "lib/win32-x86-64");

            File imageFile = new File("C:\\Users\\Sherein Dabbah\\Downloads\\ca096-d7a6d799d7a1d798d799d7a72.jpg");
            Tesseract instance = Tesseract.getInstance();  // JNA Interface Mapping
            Tesseract1 instance1 = new Tesseract1();
            instance.setLanguage("heb+eng");
            // Tesseract1 instance = new Tesseract1(); // JNA Direct Mapping
            // File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Maven build bundles English data
            // instance.setDatapath(tessDataFolder.getAbsolutePath());
            String sub ="";
            try {
                String result = instance.doOCR(imageFile);
                int indx1 = 6+result.indexOf("??????");
                int indx2 = result.indexOf("??????"); …
Run Code Online (Sandbox Code Playgroud)

java eclipse servlets tesseract tess4j

4
推荐指数
1
解决办法
2936
查看次数