Java OCR可以';即使使用灰度标度,也无法从图像中读取数字
我一直在用java开发一个宾果GUI,它基本上为您跟踪所有的宾果板。到目前为止这一切都很顺利,但目前我或用户必须手动将宾果卡上的所有数字输入到文本文档中。然后程序从那里开始处理,读取文本文档,输入数字,计算出电路板在屏幕上的位置和大小,分析用户的输入以确保没有错误,在用户请求时重置电路板,我甚至执行了一个更改命令。但是,我希望用户能够简单地为每个宾果棋盘拍一张照片,并将照片放入文件目的地,就是这样。为了做到这一点,我知道我需要某种图像阅读器。我知道这叫做OCR。我找到了一个YouTube视频,用OCR处理了一些图像。然而,我很快就了解到,它只读取红色字符,而不读取黑色宾果数字。所以我读到的叠加流线程表示转换为灰度。我在谷歌上查找如何做到这一点,我成功地使用java将图像转换为灰度。然后,当我把新图像放入OCR时,它仍然不起作用,事实上更糟糕的是,它没有从特定的文件中读取任何内容。不管怎么说,这是我的图像,一个在灰度之前,一个是我转换的灰度图像 我知道stack overflow不喜欢人们上传所有代码,所以我会尝试只发布相关的OCR代码。如果你想看灰度代码或我的实际宾果程序代码,请告诉我。然而,我还没有将我的OCR或灰度代码转换为我的实际宾果程序代码,因为我仍处于测试阶段。以下是OCR代码: 主类Java OCR可以';即使使用灰度标度,也无法从图像中读取数字,java,user-interface,numbers,ocr,grayscale,Java,User Interface,Numbers,Ocr,Grayscale,我一直在用java开发一个宾果GUI,它基本上为您跟踪所有的宾果板。到目前为止这一切都很顺利,但目前我或用户必须手动将宾果卡上的所有数字输入到文本文档中。然后程序从那里开始处理,读取文本文档,输入数字,计算出电路板在屏幕上的位置和大小,分析用户的输入以确保没有错误,在用户请求时重置电路板,我甚至执行了一个更改命令。但是,我希望用户能够简单地为每个宾果棋盘拍一张照片,并将照片放入文件目的地,就是这样。为了做到这一点,我知道我需要某种图像阅读器。我知道这叫做OCR。我找到了一个YouTube视频,用
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引擎找到数字。从他们发布的例子来看,它应该很容易发现数字。