Java 从图像到字符串的手写识别

Java 从图像到字符串的手写识别,java,ocr,encog,handwriting-recognition,Java,Ocr,Encog,Handwriting Recognition,我正在使用Encog并运行ocr样本。它很好用。但是,我想传递一个图像文件(png,jpg,…)作为参数。此图像包含要识别的文本。然后,系统应该返回一个具有“相同”文本的字符串 有人做过类似的事情吗?我该怎么开始 谢谢 步骤1:在GUI中创建文件输入并从用户处获取文件 JFileChooser fc; JButton b, b1; JTextField tf; FileInputStream in; Socket s; DataOutputStream dout; DataInputStream

我正在使用Encog并运行ocr样本。它很好用。但是,我想传递一个图像文件(png,jpg,…)作为参数。此图像包含要识别的文本。然后,系统应该返回一个具有“相同”文本的字符串

有人做过类似的事情吗?我该怎么开始


谢谢

步骤1:在GUI中创建文件输入并从用户处获取文件

JFileChooser fc;
JButton b, b1;
JTextField tf;
FileInputStream in;
Socket s;
DataOutputStream dout;
DataInputStream din;
int i;

public void actionPerformed(ActionEvent e) {
try {
    if (e.getSource() == b) {
        int x = fc.showOpenDialog(null);
        if (x == JFileChooser.APPROVE_OPTION) {
            fileToBeSent = fc.getSelectedFile();
            tf.setText(f1.getAbsolutePath());
            b1.setEnabled(true);
        } else {
            fileToBeSent = null;
            tf.setText(null;);
            b1.setEnabled(false);
        }
    }
    if (e.getSource() == b1) {
        send();
    }
} catch (Exception ex) {
}
}

 public void copy() throws IOException {
    File f1 = fc.getSelectedFile();
    tf.setText(f1.getAbsolutePath());
    in = new FileInputStream(f1.getAbsolutePath());
    while ((i = in.read()) != -1) {
        System.out.print(i);
    }
}

public void send() throws IOException {
    dout.write(i);
    dout.flush();

}
第2步:向下采样

  private void processNetwork() throws IOException {
    System.out.println("Downsampling images...");

    for (final ImagePair pair : this.imageList) {
        final MLData ideal = new BasicMLData(this.outputCount);
        final int idx = pair.getIdentity();
        for (int i = 0; i < this.outputCount; i++) {
            if (i == idx) {
                ideal.setData(i, 1);
            } else {
                ideal.setData(i, -1);
            }
        }

        final Image img = ImageIO.read(fc.getFile());
        final ImageMLData data = new ImageMLData(img);
        this.training.add(data, ideal);
    }

    final String strHidden1 = getArg("hidden1");
    final String strHidden2 = getArg("hidden2");

    this.training.downsample(this.downsampleHeight, this.downsampleWidth);

    final int hidden1 = Integer.parseInt(strHidden1);
    final int hidden2 = Integer.parseInt(strHidden2);

    this.network = EncogUtility.simpleFeedForward(this.training
            .getInputSize(), hidden1, hidden2,
            this.training.getIdealSize(), true);
    System.out.println("Created network: " + this.network.toString());
}
 private void processTrain() throws IOException {
    final String strMode = getArg("mode");
    final String strMinutes = getArg("minutes");
    final String strStrategyError = getArg("strategyerror");
    final String strStrategyCycles = getArg("strategycycles");

    System.out.println("Training Beginning... Output patterns="
            + this.outputCount);

    final double strategyError = Double.parseDouble(strStrategyError);
    final int strategyCycles = Integer.parseInt(strStrategyCycles);

    final ResilientPropagation train = new ResilientPropagation(this.network, this.training);
    train.addStrategy(new ResetStrategy(strategyError, strategyCycles));

    if (strMode.equalsIgnoreCase("gui")) {
        TrainingDialog.trainDialog(train, this.network, this.training);
    } else {
        final int minutes = Integer.parseInt(strMinutes);
        EncogUtility.trainConsole(train, this.network, this.training,
                minutes);
    }
    System.out.println("Training Stopped...");
}
第4步:将采样文件交给神经网络

 public void processWhatIs() throws IOException {
    final String filename = getArg("image");
    final File file = new File(filename);
    final Image img = ImageIO.read(file);
    final ImageMLData input = new ImageMLData(img);
    input.downsample(this.downsample, false, this.downsampleHeight,
            this.downsampleWidth, 1, -1);
    final int winner = this.network.winner(input);
    System.out.println("What is: " + filename + ", it seems to be: "
            + this.neuron2identity.get(winner));
 }

步骤5:检查结果

您尝试了什么?您是否阅读过Encog的API文档,或者查看了它的源代码和示例以了解如何使用它?是的,我尝试过。它有一个示例,我们可以在其中绘制字母并将其用作训练集。然后我们可以在辅助面板中绘制字母,看看系统是否能够识别它们。我看到它也有一个类SampleData,可能是我们可以传递图像的地方,但是我还没有尝试,我仍然不知道如何从图像中提取内容。在步骤1中,GUI是什么意思?在包“org.encog.examples.neural.gui.ocr”中有一些文件需要修改,或者我需要在那里创建一个新的文件?
  private void processNetwork() throws IOException {
    System.out.println("Downsampling images...");

    for (final ImagePair pair : this.imageList) {
        final MLData ideal = new BasicMLData(this.outputCount);
        final int idx = pair.getIdentity();
        for (int i = 0; i < this.outputCount; i++) {
            if (i == idx) {
                ideal.setData(i, 1);
            } else {
                ideal.setData(i, -1);
            }
        }

        final Image img = ImageIO.read(fc.getFile());
        final ImageMLData data = new ImageMLData(img);
        this.training.add(data, ideal);
    }

    final String strHidden1 = getArg("hidden1");
    final String strHidden2 = getArg("hidden2");

    this.training.downsample(this.downsampleHeight, this.downsampleWidth);

    final int hidden1 = Integer.parseInt(strHidden1);
    final int hidden2 = Integer.parseInt(strHidden2);

    this.network = EncogUtility.simpleFeedForward(this.training
            .getInputSize(), hidden1, hidden2,
            this.training.getIdealSize(), true);
    System.out.println("Created network: " + this.network.toString());
}
 private void processTrain() throws IOException {
    final String strMode = getArg("mode");
    final String strMinutes = getArg("minutes");
    final String strStrategyError = getArg("strategyerror");
    final String strStrategyCycles = getArg("strategycycles");

    System.out.println("Training Beginning... Output patterns="
            + this.outputCount);

    final double strategyError = Double.parseDouble(strStrategyError);
    final int strategyCycles = Integer.parseInt(strStrategyCycles);

    final ResilientPropagation train = new ResilientPropagation(this.network, this.training);
    train.addStrategy(new ResetStrategy(strategyError, strategyCycles));

    if (strMode.equalsIgnoreCase("gui")) {
        TrainingDialog.trainDialog(train, this.network, this.training);
    } else {
        final int minutes = Integer.parseInt(strMinutes);
        EncogUtility.trainConsole(train, this.network, this.training,
                minutes);
    }
    System.out.println("Training Stopped...");
}