diff --git a/engine/pom.xml b/engine/pom.xml
new file mode 100644
index 00000000..626047c4
--- /dev/null
+++ b/engine/pom.xml
@@ -0,0 +1,83 @@
+
+
+ 4.0.0
+
+
+ de.vorb
+ tesseract4java
+ 0.2.0-SNAPSHOT
+
+
+ engine
+
+
+ 0.6.0
+ 0.6.0
+
+ 1.7.21
+ 1.1.7
+
+
+
+
+ org.deeplearning4j
+ deeplearning4j-core
+ ${dl4j.version}
+
+
+ org.deeplearning4j
+ deeplearning4j-nlp
+ ${dl4j.version}
+
+
+ org.deeplearning4j
+ deeplearning4j-ui
+ ${dl4j.version}
+
+
+
+ org.nd4j
+ nd4j-native-platform
+ ${nd4j.version}
+
+
+ org.nd4j
+ nd4j-cuda-7.5
+ ${nd4j.version}
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.5.0
+
+ ${mainClass}
+
+
+
+
+
+
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/Box.java b/engine/src/main/java/de/vorb/tesseract/engine/model/Box.java
new file mode 100644
index 00000000..ba016e82
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/Box.java
@@ -0,0 +1,60 @@
+package de.vorb.tesseract.engine.model;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
+
+public class Box {
+
+ private final Offset offset;
+ private final Dimension dimension;
+
+ private Box(Offset offset, Dimension dimension) {
+
+ Preconditions.checkNotNull(offset);
+ Preconditions.checkNotNull(dimension);
+
+ this.offset = offset;
+ this.dimension = dimension;
+ }
+
+ public Offset getOffset() {
+ return offset;
+ }
+
+ public Dimension getDimension() {
+ return dimension;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Box box = (Box) o;
+
+ return offset.equals(box.offset) && dimension.equals(box.dimension);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = offset.hashCode();
+ result = 31 * result + dimension.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this)
+ .add("offset", offset)
+ .add("dimension", dimension)
+ .toString();
+ }
+
+ public static Box of(Offset offset, Dimension dimension) {
+ return new Box(offset, dimension);
+ }
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/DefaultTextSegment.java b/engine/src/main/java/de/vorb/tesseract/engine/model/DefaultTextSegment.java
new file mode 100644
index 00000000..70c539fe
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/DefaultTextSegment.java
@@ -0,0 +1,22 @@
+package de.vorb.tesseract.engine.model;
+
+class DefaultTextSegment implements TextSegment {
+
+ private final Box boundingBox;
+ private final TextSegmentationLevel segmentationLevel;
+
+ DefaultTextSegment(Box boundingBox, TextSegmentationLevel segmentationLevel) {
+ this.boundingBox = boundingBox;
+ this.segmentationLevel = segmentationLevel;
+ }
+
+ @Override
+ public Box getBoundingBox() {
+ return null;
+ }
+
+ @Override
+ public TextSegmentationLevel getLevel() {
+ return null;
+ }
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/Dimension.java b/engine/src/main/java/de/vorb/tesseract/engine/model/Dimension.java
new file mode 100644
index 00000000..d21d973d
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/Dimension.java
@@ -0,0 +1,55 @@
+package de.vorb.tesseract.engine.model;
+
+import com.google.common.base.Objects;
+
+public class Dimension {
+
+ private final int width;
+ private final int height;
+
+ private Dimension(int width, int height) {
+ this.width = width;
+ this.height = height;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Dimension that = (Dimension) o;
+
+ return width == that.width && height == that.height;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = width;
+ result = 31 * result + height;
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this)
+ .add("width", width)
+ .add("height", height)
+ .toString();
+ }
+
+ public static Dimension of(int width, int height) {
+ return new Dimension(width, height);
+ }
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/Offset.java b/engine/src/main/java/de/vorb/tesseract/engine/model/Offset.java
new file mode 100644
index 00000000..75972763
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/Offset.java
@@ -0,0 +1,55 @@
+package de.vorb.tesseract.engine.model;
+
+import com.google.common.base.Objects;
+
+public class Offset {
+
+ private final int left;
+ private final int top;
+
+ private Offset(int left, int top) {
+ this.left = left;
+ this.top = top;
+ }
+
+ public int getLeft() {
+ return left;
+ }
+
+ public int getTop() {
+ return top;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Offset that = (Offset) o;
+
+ return left == that.left && top == that.top;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = left;
+ result = 31 * result + top;
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this)
+ .add("left", left)
+ .add("top", top)
+ .toString();
+ }
+
+ public static Offset of(int left, int top) {
+ return new Offset(left, top);
+ }
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/Segment.java b/engine/src/main/java/de/vorb/tesseract/engine/model/Segment.java
new file mode 100644
index 00000000..72337c22
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/Segment.java
@@ -0,0 +1,9 @@
+package de.vorb.tesseract.engine.model;
+
+public interface Segment {
+
+ Box getBoundingBox();
+
+
+
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/TextSegment.java b/engine/src/main/java/de/vorb/tesseract/engine/model/TextSegment.java
new file mode 100644
index 00000000..6909285b
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/TextSegment.java
@@ -0,0 +1,7 @@
+package de.vorb.tesseract.engine.model;
+
+public interface TextSegment extends Segment {
+
+ TextSegmentationLevel getLevel();
+
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/model/TextSegmentationLevel.java b/engine/src/main/java/de/vorb/tesseract/engine/model/TextSegmentationLevel.java
new file mode 100644
index 00000000..614d3689
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/model/TextSegmentationLevel.java
@@ -0,0 +1,15 @@
+package de.vorb.tesseract.engine.model;
+
+public enum TextSegmentationLevel {
+
+ SYMBOL,
+ WORD,
+ TEXT_LINE,
+ PARAGRAPH,
+ BLOCK;
+
+ public TextSegment getSegmentWith(Box boundingBox) {
+ return new DefaultTextSegment(boundingBox, this);
+ }
+
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/segmentation/ImageSegmentationOptions.java b/engine/src/main/java/de/vorb/tesseract/engine/segmentation/ImageSegmentationOptions.java
new file mode 100644
index 00000000..38971cf6
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/segmentation/ImageSegmentationOptions.java
@@ -0,0 +1,4 @@
+package de.vorb.tesseract.engine.segmentation;
+
+public class ImageSegmentationOptions {
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/segmentation/ImageSegmenter.java b/engine/src/main/java/de/vorb/tesseract/engine/segmentation/ImageSegmenter.java
new file mode 100644
index 00000000..b1160c66
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/segmentation/ImageSegmenter.java
@@ -0,0 +1,4 @@
+package de.vorb.tesseract.engine.segmentation;
+
+public interface ImageSegmenter {
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/segmentation/impl/SimpleImageSegmenter.java b/engine/src/main/java/de/vorb/tesseract/engine/segmentation/impl/SimpleImageSegmenter.java
new file mode 100644
index 00000000..63f22efa
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/segmentation/impl/SimpleImageSegmenter.java
@@ -0,0 +1,4 @@
+package de.vorb.tesseract.engine.segmentation.impl;
+
+public class ParallelImageSegmenter {
+}
diff --git a/engine/src/main/java/de/vorb/tesseract/engine/util/ImageUtils.java b/engine/src/main/java/de/vorb/tesseract/engine/util/ImageUtils.java
new file mode 100644
index 00000000..771cb496
--- /dev/null
+++ b/engine/src/main/java/de/vorb/tesseract/engine/util/ImageUtils.java
@@ -0,0 +1,19 @@
+package de.vorb.tesseract.engine.util;
+
+import de.vorb.tesseract.engine.model.Box;
+
+import java.awt.image.BufferedImage;
+
+public final class ImageHelper {
+
+ private ImageHelper() {}
+
+ public static BufferedImage getSubImageForBoundingBox(BufferedImage source, Box boundingBox) {
+ return source.getSubimage(
+ boundingBox.getOffset().getLeft(),
+ boundingBox.getOffset().getTop(),
+ boundingBox.getDimension().getWidth(),
+ boundingBox.getDimension().getHeight());
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 7e55dd78..20cd9041 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,9 +9,17 @@
0.2.0-SNAPSHOT
pom
+
+ io.spring.platform
+ platform-bom
+ 2.0.8.RELEASE
+
+
+
gui
tools
+ engine
@@ -20,4 +28,16 @@
1.8
+
+
+ org.springframework
+ spring-context
+
+
+
+ com.google.guava
+ guava
+
+
+