Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OCR可以';即使使用灰度标度,也无法从图像中读取数字_Java_User Interface_Numbers_Ocr_Grayscale - Fatal编程技术网

Java OCR可以';即使使用灰度标度,也无法从图像中读取数字

Java OCR可以';即使使用灰度标度,也无法从图像中读取数字,java,user-interface,numbers,ocr,grayscale,Java,User Interface,Numbers,Ocr,Grayscale,我一直在用java开发一个宾果GUI,它基本上为您跟踪所有的宾果板。到目前为止这一切都很顺利,但目前我或用户必须手动将宾果卡上的所有数字输入到文本文档中。然后程序从那里开始处理,读取文本文档,输入数字,计算出电路板在屏幕上的位置和大小,分析用户的输入以确保没有错误,在用户请求时重置电路板,我甚至执行了一个更改命令。但是,我希望用户能够简单地为每个宾果棋盘拍一张照片,并将照片放入文件目的地,就是这样。为了做到这一点,我知道我需要某种图像阅读器。我知道这叫做OCR。我找到了一个YouTube视频,用

我一直在用java开发一个宾果GUI,它基本上为您跟踪所有的宾果板。到目前为止这一切都很顺利,但目前我或用户必须手动将宾果卡上的所有数字输入到文本文档中。然后程序从那里开始处理,读取文本文档,输入数字,计算出电路板在屏幕上的位置和大小,分析用户的输入以确保没有错误,在用户请求时重置电路板,我甚至执行了一个更改命令。但是,我希望用户能够简单地为每个宾果棋盘拍一张照片,并将照片放入文件目的地,就是这样。为了做到这一点,我知道我需要某种图像阅读器。我知道这叫做OCR。我找到了一个YouTube视频,用OCR处理了一些图像。然而,我很快就了解到,它只读取红色字符,而不读取黑色宾果数字。所以我读到的叠加流线程表示转换为灰度。我在谷歌上查找如何做到这一点,我成功地使用java将图像转换为灰度。然后,当我把新图像放入OCR时,它仍然不起作用,事实上更糟糕的是,它没有从特定的文件中读取任何内容。不管怎么说,这是我的图像,一个在灰度之前,一个是我转换的灰度图像

我知道stack overflow不喜欢人们上传所有代码,所以我会尝试只发布相关的OCR代码。如果你想看灰度代码或我的实际宾果程序代码,请告诉我。然而,我还没有将我的OCR或灰度代码转换为我的实际宾果程序代码,因为我仍处于测试阶段。以下是OCR代码:

主类

package com.chillyfacts.com;
import java.io.PrintWriter;
public class my_main {
public static void main(String[] args) {
 String input_file="E:\\testfiles\\bcard.png";
 String output_file="E:\\testfiles\\outputOCR";
 String tesseract_install_path="E:\\Tesseract-OCR\\tesseract";
 String[] command =
    {
        "cmd",
    };
    Process p;
 try {
 p = Runtime.getRuntime().exec(command);
        new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
        new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
        PrintWriter stdin = new PrintWriter(p.getOutputStream());
        stdin.println("\""+tesseract_install_path+"\" \""+input_file+"\" \""+output_file+"\" -l eng");
        stdin.close();
        p.waitFor();
        //System.out.println();
        //System.out.println();
        //System.out.println();
        //System.out.println();
        System.out.println(Read_File.read_a_file(output_file+".txt"));
    } catch (Exception e) {
 e.printStackTrace();
    }
  }
}
以下是SyncPipe类:

package com.chillyfacts.com;

import java.io.InputStream;
import java.io.OutputStream;
class SyncPipe implements Runnable
{
    public SyncPipe(InputStream istrm, OutputStream ostrm) {
        istrm_=istrm;
        ostrm_=ostrm;
    }
    public void run() {
        try {
            final byte[] buffer=new byte[1024];
            for (int length=0;(length=istrm_.read(buffer))!=-1;)
            {
                ostrm_.write(buffer,0,length);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    private final OutputStream ostrm_;
    private final InputStream istrm_;
}
以下是读取文件类:

package com.chillyfacts.com;
import java.io.BufferedReader;
import java.io.FileReader;
public class Read_File {
    public static String read_a_file(String file_name) {
        BufferedReader br = null; 
        String read_string="";
        try {
        String sCurrentLine;
        br = new BufferedReader(new FileReader(file_name));
        while ((sCurrentLine = br.readLine()) != null) {
        read_string=read_string+sCurrentLine;
        }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        try {
            if (br != null)br.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        }
        return read_string;
    }
}
我是OCR新手,所以请对我放松点。提前谢谢


也许我遗漏了什么,但看起来java代码所做的只是对输入文件调用Tesseract,并通过shell cmd提示符将结果推送到输出文件。我不认为您在此处发布的任何内容都可以更改以改进Tesseract的工作方式,除非您可以在命令语句中为其提供命令行参数,这些参数会影响其处理颜色的方式。这可能有助于查看Tesseract ocr帮助页。似乎有几个选择:这只是ocr代码,就像我说的,所以你可能看到的图像有一个普通的和另一个bing灰度。我以为tesseract可以从图像中读取数字。但事实并非如此,所以我想我是在问如何正确阅读。也许你需要看更多的代码?我看过你提供的维基,但我不确定你到底在说什么。tesseract确实从我给它的一些图像中读取,而不是我想要的图像,那么我如何才能让它从我想要的图像中读取呢?我最初认为这是因为颜色,因此我转换为灰度,但现在我不确定。可能有很多问题,比如数字的角度、字体大小等。你可以尝试输入不同的dpi值,比如--dpi 300或--dpi 1200,看看它是否有助于ocr引擎找到数字。从他们发布的例子来看,它应该很容易发现数字。