-
Notifications
You must be signed in to change notification settings - Fork 5
/
DocFields.java
106 lines (88 loc) · 3.39 KB
/
DocFields.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package org.genericsystem.cv.classifier;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import org.genericsystem.cv.Img;
import org.genericsystem.cv.utils.RectToolsMapper;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.vertx.core.json.Json;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class DocFields extends AbstractFields {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final String FIELDS = "fields";
public DocFields() {
this.fields = new ArrayList<>();
}
public DocFields(List<DocField> fields) {
super((List) fields);
}
public static DocFields of(List<Rect> rects) {
DocFields fields = new DocFields();
fields.buildFields(rects);
return fields;
}
public static DocFields of(JsonObject jsonFields) {
List<DocField> list = new ArrayList<>();
JsonArray array = jsonFields.getJsonArray(FIELDS);
array.forEach(field -> {
try {
list.add((DocField) field);
} catch (Exception e) {
logger.debug("Unable to cast {} as DocField ({}). Using Json.decodeValue instead.", field, e.getMessage());
DocField f = Json.decodeValue(((JsonObject) field).encode(), DocField.class);
list.add(f);
}
});
DocFields fields = new DocFields(list);
return fields;
}
public JsonObject toJsonObject() {
return new JsonObject().put(FIELDS, fields);
}
public void buildFields(List<Rect> rects) {
AtomicInteger counter = new AtomicInteger(0);
fields = rects.stream().map(rect -> new DocField(counter.incrementAndGet(), rect)).collect(Collectors.toList());
}
public Img annotateImage(final Img img, final double fontScale, final Scalar color, final int thickness) {
Img annotated = new Img(img.getSrc(), true);
stream().forEach(field -> ((DocField) field).annotateImage(annotated, fontScale, color, thickness));
return annotated;
}
public void drawOcrPerspectiveInverse(Img display, Scalar color, int thickness) {
consolidatedFieldStream().forEach(field -> ((DocField) field).drawOcrPerspectiveInverse(display, color, thickness));
}
@Override
public void drawConsolidated(Img stabilizedDisplay) {
consolidatedFieldStream().forEach(field -> ((DocField) field).drawRect(stabilizedDisplay, new Scalar(0, 0, 255), 2));
}
@Override
public void consolidateOcr(Img rootImg) {
// Need to process all fields for documents
stream().forEach(f -> f.ocr(rootImg));
}
@Override
protected Field getIntersection(AbstractField field1, AbstractField field2) {
Rect rect1 = field1.getRect();
Rect rect2 = field2.getRect();
Rect intersect = RectToolsMapper.getIntersection(rect1, rect2).orElseThrow(() -> new IllegalArgumentException("No intersecting rectangle was found"));
Field intersection = new Field(intersect);
Arrays.asList(field1, field2).forEach(f -> intersection.merge(f));
return intersection;
}
@Override
protected Field getUnion(AbstractField field1, AbstractField field2) {
Rect rect1 = field1.getRect();
Rect rect2 = field2.getRect();
Field union = new Field(RectToolsMapper.getUnion(rect1, rect2));
Arrays.asList(field1, field2).forEach(f -> union.merge(f));
return union;
}
}