OCR-не может прочитать цифры с изображения, даже с оттенками серого - PullRequest
0 голосов
/ 24 сентября 2019

Я работал над графическим интерфейсом бинго в Java, который в основном отслеживает все ваши доски для бинго для вас.Пока все идет хорошо, но в настоящее время мне или пользователю придется вручную вводить все числа на карточке бинго в текстовый документ.Затем программа обрабатывает его оттуда, читая текстовый документ, вводя числа, выясняя расположение доски и размер на экране, анализируя ввод от пользователя, чтобы убедиться, что ошибки не были допущены, сбрасывает доски по запросу пользователя иЯ даже реализовал команду изменения.Тем не менее, я хочу, чтобы пользователь просто мог сфотографировать каждую доску бинго и поместить изображения в место назначения файла, и это все.Чтобы сделать это, я знал, что мне понадобится какой-нибудь считыватель изображений.Я узнал, что это называется OCR.Я нашел видео из трубки и заставил OCR работать с некоторыми изображениями.Однако я быстро узнал, что он читает только красные символы, а не черные цифры бинго.Таким образом, стек поверх потока, который я прочитал, сказал, чтобы преобразовать в оттенки серого.Я смотрю на Google о том, как это сделать, и я успешно смог преобразовать изображение в оттенки серого, используя Java.Затем, когда я помещаю это новое изображение в OCR, оно все равно не работает, на самом деле оно хуже, поскольку оно ничего не читает из этого конкретного файла.В любом случае, вот мои изображения: одно перед серой шкалой, а другое - преобразованное серое.

https://imgur.com/a/mAIjUu3

Я знаю, что переполнение стека не нравится, когда люди загружают весь код, поэтому я постараюсь опубликовать только соответствующий код 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, поэтому, пожалуйста, будьте осторожны со мной.Заранее спасибо.

enter image description here

...