!7 static double spaceWidth = 8; // typical line dists: 6, 21 static float lineDist1 = 6, lineDist2 = 22; static float lineHeight = lineDist2-lineDist1; p-type { RGBImage img = rgbShootScreenHidingConsole(; Rect r = ocr_findSnippetSource(img; if (r == null) { print("No snippet source found."; ret; } print("Scanning: " + r; BWImage bwImage = new BWImage(img.clip(r; L clips = autoSegment(bwImage; L r2 = ocr_mergeOverlappingY(clips; //L r2 = ocr_mergeOverlappingY_plusPercent(clips, 7; r2 = sortByField(r2, "y"); /*for (Rect rx : r2) { print("h=" + rx.h + ". " + struct(bwImageRowBrightnesses(bwImage.clip(rx; }*/ // Split rows for i over r2: { Rect rx = r2.get(i; BWImage cImg = bwImage.clip(rx); int h = rx.h/2; //float[] rows = bwImageRowBrightnesses(bwImage.clip(rx)); //float b = rows[l(rows)/2]; float b = (float) cImg.clip(0, h, rx.w, 1).averageBrightness(); if (b > 0.93f) { Rect upper = new Rect(rx.x, rx.y, rx.w, h); Rect lower = new Rect(rx.x, rx.y+h, rx.w, rx.h-h); r2.set(i, lower); r2.add(i++, upper); } } // Merge rows for (int i = 0; i < l(r2)-1; i++) { Rect a = r2.get(i), b = r2.get(i+1); if (b.h < a.h/2 && (b.y-a.y2()) < 2) { // fix the dangling underscore r2.set(i, mergeRects(a, b)); r2.remove(i+1); } } r2 = bwAutoCropClips(bwImage, r2); showImageWithSelections(bwImage.getBufferedImage(), r2; focusConsole(); growToTop(consoleFrame()); enableFullSearchInSimpleRecognizer(filledSimpleRecognizer_cached()); L lines = ocr_recognizeTextClips(bwImage, r2; lines = map(f ocr_unescape, lines); addIndents(lines, r2); addEmptyRows(lines, r2); printNumbered_flushed(lines; } svoid addIndents(L lines, L rects) { int n = l(lines); assertEquals(n, l(rects)); int leftBorder = toInt(collectMinInt(rects, "x")); for i to n: { int dist = rects.get(i).x-leftBorder; print("dist=" + dist); int spaces = iround(dist/spaceWidth; if (spaces > 0) lines.set(i, rep(spaces, ' ') + lines.get(i)); } } svoid addEmptyRows(L lines, L rects) { int n = l(lines); assertEquals(n, l(rects)); for (int i = 0; i+1 < n; i++) { Rect a = rects.get(i), b = rects.get(i+1); if (a != null && b != null) { int dist = b.y-a.y2(); float frows = (dist-lineDist1)/lineHeight; int rows = iround(frows); print("dist=" + dist + ", rows=" + frows); if (rows > 0) { lines.addAll(i+1, rep("", rows)); rects.addAll(i+1, rep((Rect) null, rows)); i += rows-1; } } } }