diff --git a/.gitignore b/.gitignore index 2531f82e..6be03663 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,7 @@ *.iml target/ /gui/hs_err_pid*.log +**/.vscode +**/.settings +**/.classpath +**/.project \ No newline at end of file diff --git a/README.md b/README.md index 14b981c6..8b2fc31f 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ by Paul Vorbach (German). [![Donate with PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=LF8T2JP2YUUUE) +## Usage +Basic usage is documented on [our wiki page](https://github.com/tesseract4java/tesseract4java/wiki/Usage) ## Download diff --git a/gui/pom.xml b/gui/pom.xml index 64fa5ab6..d3f526fc 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -34,7 +34,7 @@ junit junit - 4.12 + 4.13.1 test diff --git a/gui/src/main/java/de/vorb/tesseract/gui/controller/TesseractController.java b/gui/src/main/java/de/vorb/tesseract/gui/controller/TesseractController.java index d11f7db7..dc6a3513 100644 --- a/gui/src/main/java/de/vorb/tesseract/gui/controller/TesseractController.java +++ b/gui/src/main/java/de/vorb/tesseract/gui/controller/TesseractController.java @@ -1,5 +1,6 @@ package de.vorb.tesseract.gui.controller; +import com.google.common.collect.Lists; import de.vorb.tesseract.gui.io.BoxFileReader; import de.vorb.tesseract.gui.io.BoxFileWriter; import de.vorb.tesseract.gui.io.PlainTextWriter; @@ -49,8 +50,6 @@ import de.vorb.tesseract.util.TraineddataFiles; import de.vorb.tesseract.util.feat.Feature3D; import de.vorb.util.FileNames; - -import com.google.common.collect.Lists; import eu.digitisation.input.Batch; import eu.digitisation.input.Parameters; import eu.digitisation.input.WarningException; @@ -231,6 +230,8 @@ public TesseractController() { try { pageRecognitionProducer.init(); + pageRecognitionProducer.setPageSegmentationMode(getPageSegmentationMode()); + } catch (IOException e) { e.printStackTrace(); } @@ -1141,6 +1142,21 @@ private void handlePreferences() { final String editorFont = (String) prefDialog.getComboEditorFont().getSelectedItem(); globalPrefs.put(PreferencesDialog.KEY_EDITOR_FONT, editorFont); + // Update the page segmentation mode if necessary + int currentPageSegMode = getPageSegmentationMode(); + int pageSegMode = prefDialog.getPageSegmentationMode(); + boolean hasPageSegModeChanged = currentPageSegMode != pageSegMode; + if (hasPageSegModeChanged) { + globalPrefs.putInt(PreferencesDialog.KEY_PAGE_SEG_MODE, pageSegMode); + pageRecognitionProducer.setPageSegmentationMode(pageSegMode); + + // Update model with new segmentation mode + if (activeComponent instanceof PageModelComponent) { + final Optional pm = ((PageModelComponent) activeComponent).getPageModel(); + pm.ifPresent(it -> setImageModel(Optional.of(it.getImageModel()))); + } + } + view.getRecognitionPane().setRenderingFont(renderingFont); if (view.getActiveComponent() == view.getRecognitionPane()) { view.getRecognitionPane().render(); @@ -1241,6 +1257,10 @@ private void handleTesseractTrainer() { trainer.setVisible(true); } + private int getPageSegmentationMode() { + return PreferencesUtil.getPreferences().getInt(PreferencesDialog.KEY_PAGE_SEG_MODE, PreferencesDialog.DEFAULT_PSM_MODE); + } + public void setPageModel(Optional model) { if (projectModel.isPresent() && model.isPresent()) { try { diff --git a/gui/src/main/java/de/vorb/tesseract/gui/view/dialogs/PreferencesDialog.java b/gui/src/main/java/de/vorb/tesseract/gui/view/dialogs/PreferencesDialog.java index ba9e8e61..f54c69ab 100644 --- a/gui/src/main/java/de/vorb/tesseract/gui/view/dialogs/PreferencesDialog.java +++ b/gui/src/main/java/de/vorb/tesseract/gui/view/dialogs/PreferencesDialog.java @@ -26,15 +26,35 @@ public class PreferencesDialog extends JDialog { private static final long serialVersionUID = 1L; + private static final String[] PSM_MODES = { + "0 - PSM_OSD_ONLY", + "1 - PSM_AUTO_OSD", + "2 - PSM_AUTO_ONLY", + "3 - (DEFAULT) PSM_AUTO", + "4 - PSM_SINGLE_COLUMN", + "5 - PSM_SINGLE_BLOCK_VERT_TEXT", + "6 - PSM_SINGLE_BLOCK", + "7 - PSM_SINGLE_LINE", + "8 - PSM_SINGLE_WORD", + "9 - PSM_CIRCLE_WORD", + "10 - PSM_SINGLE_CHAR", + "11 - PSM_SPARSE_TEXT", + "12 - PSM_SPARSE_TEXT_OSD", + "13 - PSM_RAW_LINE", + }; + public static final int DEFAULT_PSM_MODE = 3; + public static final String KEY_LANGDATA_DIR = "langdata_dir"; public static final String KEY_RENDERING_FONT = "rendering_font"; public static final String KEY_EDITOR_FONT = "editor_font"; + public static final String KEY_PAGE_SEG_MODE = "page_seg_mode"; private final JPanel contentPanel = new JPanel(); private JTextField tfLangdataDir; private final JComboBox comboRenderingFont; private final JComboBox comboEditorFont; + private final JComboBox comboPageSegMode; private ResultState resultState = ResultState.CANCEL; @@ -134,48 +154,20 @@ public PreferencesDialog() { final GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); final String[] availableFontFamilyNames = graphicsEnvironment.getAvailableFontFamilyNames(); - { - JLabel lblRenderingFont = new JLabel("Rendering font:"); - GridBagConstraints gbc_lblRenderingFont = new GridBagConstraints(); - gbc_lblRenderingFont.anchor = GridBagConstraints.EAST; - gbc_lblRenderingFont.insets = new Insets(0, 0, 0, 5); - gbc_lblRenderingFont.gridx = 0; - gbc_lblRenderingFont.gridy = 2; - contentPanel.add(lblRenderingFont, gbc_lblRenderingFont); - } - { - comboRenderingFont = new JComboBox<>(); - GridBagConstraints gbc_comboRenderingFont = new GridBagConstraints(); - gbc_comboRenderingFont.insets = new Insets(0, 0, 0, 5); - gbc_comboRenderingFont.fill = GridBagConstraints.HORIZONTAL; - gbc_comboRenderingFont.gridx = 1; - gbc_comboRenderingFont.gridy = 2; - contentPanel.add(comboRenderingFont, gbc_comboRenderingFont); - - Arrays.stream(availableFontFamilyNames).forEach(comboRenderingFont::addItem); - comboRenderingFont.setSelectedItem(pref.get(PreferencesDialog.KEY_RENDERING_FONT, Font.SANS_SERIF)); - } - { - JLabel lblEditorFont = new JLabel("Editor font:"); - GridBagConstraints gbc_lblEditorFont = new GridBagConstraints(); - gbc_lblEditorFont.anchor = GridBagConstraints.EAST; - gbc_lblEditorFont.insets = new Insets(0, 0, 0, 5); - gbc_lblEditorFont.gridx = 0; - gbc_lblEditorFont.gridy = 3; - contentPanel.add(lblEditorFont, gbc_lblEditorFont); - } - { - comboEditorFont = new JComboBox<>(); - GridBagConstraints gbc_comboEditorFont = new GridBagConstraints(); - gbc_comboEditorFont.insets = new Insets(0, 0, 0, 5); - gbc_comboEditorFont.fill = GridBagConstraints.HORIZONTAL; - gbc_comboEditorFont.gridx = 1; - gbc_comboEditorFont.gridy = 3; - contentPanel.add(comboEditorFont, gbc_comboEditorFont); - - Arrays.stream(availableFontFamilyNames).forEach(comboEditorFont::addItem); - comboEditorFont.setSelectedItem(pref.get(PreferencesDialog.KEY_EDITOR_FONT, Font.MONOSPACED)); - } + // Rendering font + addGridLabel(0, 2, "Rendering font:"); + final String initialFontFamilyName = pref.get(PreferencesDialog.KEY_EDITOR_FONT, Font.SANS_SERIF); + comboRenderingFont = createGridComboBox(1, 2, availableFontFamilyNames, initialFontFamilyName); + + // Editor font + addGridLabel(0, 3, "Editor font:"); + final String initialEditorFontFamilyName = pref.get(PreferencesDialog.KEY_RENDERING_FONT, Font.MONOSPACED); + comboEditorFont = createGridComboBox(1, 3, availableFontFamilyNames, initialEditorFontFamilyName); + + // Page Segmentation Modes + addGridLabel(0, 4, "Page Segmentation Mode:"); + final int pageSegMode = pref.getInt(PreferencesDialog.KEY_PAGE_SEG_MODE, DEFAULT_PSM_MODE); + comboPageSegMode = createGridComboBox(1, 4, PSM_MODES, PSM_MODES[pageSegMode]); pack(); setMinimumSize(getSize()); @@ -197,9 +189,39 @@ public JComboBox getComboEditorFont() { return comboEditorFont; } + public int getPageSegmentationMode() { + return comboPageSegMode.getSelectedIndex(); + } + public ResultState showPreferencesDialog(Component parent) { setLocationRelativeTo(parent); setVisible(true); return resultState; } + + private Component addGridLabel(int gridX, int gridY, String label) { + JLabel jLabel = new JLabel(label); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.anchor = GridBagConstraints.EAST; + constraints.insets = new Insets(0, 0, 0, 5); + constraints.gridx = gridX; + constraints.gridy = gridY; + contentPanel.add(jLabel, constraints); + return jLabel; + } + + private JComboBox createGridComboBox(int gridX, int gridY, T[] options, T selectedItem) { + JComboBox jComboBox = new JComboBox<>(); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.insets = new Insets(0, 0, 0, 5); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridx = gridX; + constraints.gridy = gridY; + contentPanel.add(jComboBox, constraints); + + Arrays.stream(options).forEach(jComboBox::addItem); + jComboBox.setSelectedItem(selectedItem); + return jComboBox; + } + } diff --git a/gui/src/main/java/de/vorb/tesseract/gui/work/PageRecognitionProducer.java b/gui/src/main/java/de/vorb/tesseract/gui/work/PageRecognitionProducer.java index 11acc9a1..bb3e50ed 100644 --- a/gui/src/main/java/de/vorb/tesseract/gui/work/PageRecognitionProducer.java +++ b/gui/src/main/java/de/vorb/tesseract/gui/work/PageRecognitionProducer.java @@ -30,6 +30,7 @@ public class PageRecognitionProducer extends RecognitionProducer { private final TesseractController controller; private final HashMap variables = new HashMap<>(); + private int pageSegmentationMode = tesseract.PSM_AUTO; public PageRecognitionProducer(TesseractController controller, Path tessdataDir, String trainingFile) { @@ -67,7 +68,7 @@ public void reset() throws IOException { tesseract.OEM_DEFAULT); // set page segmentation mode - tesseract.TessBaseAPISetPageSegMode(getHandle(), tesseract.PSM_AUTO); + tesseract.TessBaseAPISetPageSegMode(getHandle(), pageSegmentationMode); // set variables for (Entry var : variables.entrySet()) { @@ -80,6 +81,11 @@ public void close() throws IOException { tesseract.TessBaseAPIDelete(getHandle()); } + public void setPageSegmentationMode(int pageSegmentationMode) { + this.pageSegmentationMode = pageSegmentationMode; + tesseract.TessBaseAPISetPageSegMode(getHandle(), pageSegmentationMode); + } + public void loadImage(Path imageFile) { if (lastPix.isPresent()) { // destroy old pix diff --git a/ocrevalUAtion/pom.xml b/ocrevalUAtion/pom.xml index e12af5dd..45b5a58e 100644 --- a/ocrevalUAtion/pom.xml +++ b/ocrevalUAtion/pom.xml @@ -29,7 +29,7 @@ UTF-8 - 1.6 + 1.7 @@ -39,8 +39,8 @@ maven-compiler-plugin 3.1 - 1.6 - 1.6 + 1.7 + 1.7 true @@ -198,7 +198,7 @@ junit junit - 4.11 + 4.13.1 test