!752 !include #1004250 // Eye static S imageID = "#1004248"; static JTable table; static BufferedImage image; static RGBImage rgbImage; static BWImage bwImage; static ImageSurface imageSurface; static new L data; static JFrame imageFrame; static new Map comments; static ImageReader recognizer; // just for compiling p { imageID = or2(get(args, 0), imageID); image = loadImage2(imageID); imageSurface = showImage(image, "The Image [" + imageID + "]"); imageSurface.setZoom(2); /* ri = new XRecognizableImage; //ri.imageInfo = ii; ri.setImage(image); ri.imageSurface.setZoom(2); ri.setDrawMarkLines(true); ri.setDrawConfidenceBoxes(true); imageFrame = showFrame("The Image [" + imageID + "]", ri); frameIcon(imageFrame, "#1004230"); moveToTopRightCorner(imageFrame); */ // hints hint("There are 6 letters"); // compute stuff addLine("Image Size", "Image size is " + iW() + " * " + iH() + " px"); addLine("Flexible Segmenter", func { L segments = new FlexibleSegmenter().segment(iBW()); ret segmentsToString(segments); }); rebuildTable(); tableColumnMaxWidth(table, 0, 200); onDoubleClickOrEnter(table, voidfunc(int row) { Map map = getTableLineAsMap(table, row); if (map == null) ret; S text = getString(map, "Text"); showBoxes(findBoxes(text)); }); } svoid addLine(S who, O gen) { S line; if (gen instanceof S) line = (S) gen; else try { line = str(callF(gen)); } catch e { who = "[Error] " + who; e.printStackTrace(); line = exceptionToStringShort(e); } data.add(litorderedmap("Who", who, "Text", line)); } svoid hint(S text) { addLine("Hint", text); } static int iW() { ret iB().getWidth(); } static int iH() { ret iB().getHeight(); } static BufferedImage iB() { ret image; } static RGBImage iRGB() { if (rgbImage == null) rgbImage = new RGBImage(image); ret rgbImage; } static BWImage iBW() { if (bwImage == null) bwImage = new BWImage(image); ret bwImage; } static S segmentsToString(L l) { ret join(" ", map(func(Segment s) { rectToString(s.boundingBox) }, l)); } static S rectToString(Rectangle r) { ret "[" + r.x + " " + r.y + " " + r.width + " " + r.height + "]"; } svoid showBoxes(L l) { print("Showing boxes: " + struct(l)); /* new L di; int n = 0; for (Rectangle r : l) { ++n; Subrecognition sr = new Subrecognition(r, null, null, "Box " + n); di.add(new DebugItem("bla", sr)); } */ BufferedImage img = copyImage(image); drawBoxes(img, l, Color.red, 0.5f); imageSurface.setImage(img); //ri.setDebugInfo(di); //ri.repaintImageSurface(); } static L findBoxes(S s) { L tok = javaTok(s); new L boxes; for (int i = 1; i < l(tok); i += 2) { if (eq(tok.get(i), "[")) try { int x = parseInt(get(tok, i+2)); int y = parseInt(get(tok, i+4)); int w = parseInt(get(tok, i+6)); int h = parseInt(get(tok, i+8)); boxes.add(new Rectangle(x, y, w, h)); } catch {} } ret boxes; } svoid addComment(S text, S comment) { comments.put(text, comment); for (Map m : data) if (eq(text, get(m, "Text"))) m.put("Comment", comment); rebuildTable(); } svoid rebuildTable() { table = showTable(table, data, "Image Analysis"); }