OCR-即使进行灰度缩放也无法从图像中读取数字

时间:2019-09-24 16:06:23

标签: java user-interface numbers ocr grayscale

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

https://imgur.com/a/mAIjUu3

我知道当人们上传所有代码时,堆栈溢出不喜欢它,因此,我将尝试仅发布相关的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的新手,所以请放轻松。预先感谢。

enter image description here

0 个答案:

没有答案