我一直在用Java开发Bingo GUI,基本上可以为您跟踪所有的Bingo板。到目前为止进展顺利,但是目前我或用户将必须手动将宾果卡上的所有数字输入文本文件。然后程序从那里开始处理它,方法是读取文本文档,将数字放入,确定电路板的位置和大小在屏幕上,分析用户的输入以确保没有错误,在用户请求时重置电路板,以及我什至执行了一条更改命令。但是,我希望用户能够简单地为每个宾果游戏板拍照,然后将图片放入文件目标位置,就是这样。为了做到这一点,我知道我需要某种图像读取器。我了解到这称为OCR。我找到了一个您可以观看的视频,并让OCR可以处理某些图像。但是,我很快了解到它只读取红色字符,而不读取黑色的宾果游戏数字。因此,我读过的流线堆栈表示可以转换为灰度。我在Google上查找了相关操作方法,并成功使用Java将图像转换为灰度。然后,当我将该新映像放入OCR时,它仍然不起作用,实际上,由于它不从该特定文件中读取任何内容,因此情况更糟。因此,无论如何,这是我的图像,一个是在灰度之前,另一个是我转换后的灰度图像。
我知道当人们上传所有代码时,堆栈溢出不喜欢它,因此,我将尝试仅发布相关的OCR代码。如果您想查看灰度代码或我的实际宾果程序代码,请告诉我。但是,我还没有将我的OCR或灰度代码转换为实际的bingo程序代码,因为我仍处于测试阶段。这是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的新手,所以请放轻松。预先感谢。