1 | // For now, leave out of inner class. |
2 | |
3 | concept BoxShot { |
4 | Rect r; |
5 | S imageMD5; |
6 | //byte[] png; |
7 | new RefL<TimeRange> timeRanges; |
8 | } |
9 | |
10 | concept Evaluation { |
11 | new Ref<BoxShot> shot; |
12 | S comment; |
13 | } |
14 | |
15 | concept Boxes { |
16 | new L<Rect> encouragedBoxes; |
17 | new L<Rect> discouragedBoxes; |
18 | } |
19 | |
20 | sclass FindURLBoxApp { |
21 | int sleepTimeWhenNotFound = 5000; |
22 | static int frameHeight = 100; |
23 | |
24 | volatile bool recognizing = true; |
25 | JFrame frame; |
26 | SingleComponentPanel scp; |
27 | ImageSurface imageSurface; |
28 | FindURLBox1 finder; |
29 | S title = "Find URL Box"; |
30 | |
31 | BoxShot shot; |
32 | TimeRange timeRange; |
33 | |
34 | Evaluation > WrongResult {} // This seems to work as inner-inner class, just syntax enhancements get confused |
35 | Evaluation > GoodResult {} |
36 | |
37 | void init() { |
38 | // clean up old field |
39 | for (BoxShot shot) { |
40 | if (shot.fieldValues.containsKey("png")) { |
41 | cset(shot, png := null); |
42 | print("Cleared PNG " + shot.id); |
43 | } |
44 | } |
45 | |
46 | swingAndWait(r { |
47 | finder = new FindURLBox1; |
48 | JComponent feedback = jRightAlignedLine( |
49 | jlabel("Is this the right box?"), |
50 | jbutton("Yes", r { yes() }), |
51 | jbutton("No", r { no() }), |
52 | jbutton("Start over", r { startOver() })); |
53 | scp = new SingleComponentPanel(jcenteredLabel("-")); |
54 | frame = showFrame(title, centerAndSouth(scp, feedback)); |
55 | setRecognizing(true); |
56 | frameInnerSize(frame, 500, frameHeight); |
57 | moveToBottomRightCorner(frame); |
58 | frame.setAlwaysOnTop(true); |
59 | |
60 | awtCalcRegularly(frame, 200, 0, r { calc() }); |
61 | }); |
62 | } |
63 | |
64 | void calc { |
65 | if (!recognizing) ret; // paused |
66 | finder.encouragedBoxes = uniq(Boxes).encouragedBoxes; |
67 | finder.discouragedBoxes = uniq(Boxes).discouragedBoxes; |
68 | final bool b = finder.go(); |
69 | awt { |
70 | if (b) { |
71 | RGBImage img = finder.bestImage(); |
72 | S since = ""; |
73 | if (shot != null && timeRange != null) |
74 | since = ", since " + (now()-timeRange.from)/1000 + "s, " + nth(l(shot.timeRanges)) + " appearance"; |
75 | S text = "URL box found in " + finder.recogTime + " ms (" + img.w() + "*" + img.h() + " px" + since + ")"; |
76 | if (imageSurface == null) { |
77 | imageSurface = new ImageSurface(img); |
78 | scp.setComponent(jSection(text, new JScrollPane(imageSurface))); |
79 | } else { |
80 | imageSurface.setImage(img); |
81 | setSectionTitle(imageSurface, text); |
82 | } |
83 | |
84 | S imageMD5 = md5OfRGBImage(img); |
85 | shot = findConcept(BoxShot, +imageMD5); |
86 | if (shot == null) { |
87 | shot = uniq(BoxShot, +imageMD5); |
88 | logStructure(getProgramFile("md5-png.log"), |
89 | litorderedmap(+imageMD5, png := rgbImageToPNG(img))); |
90 | } |
91 | cset(shot, r := finder.bestClip); |
92 | if (shot.timeRanges.contains(timeRange)) |
93 | timeRange.addNow(); |
94 | else |
95 | shot.timeRanges.add(timeRange = new TimeRange(now())); |
96 | shot.change(); |
97 | } else { |
98 | shot = null; |
99 | timeRange = null; |
100 | if (imageSurface != null) { |
101 | imageSurface = null; |
102 | scp.setComponent(jcenteredLabel("URL box not found (" + finder.recogTime + " ms)")); |
103 | } |
104 | } |
105 | } |
106 | if (!b) sleep(sleepTimeWhenNotFound); |
107 | } |
108 | |
109 | void yes { |
110 | print("yes"); |
111 | if (addOrMoveToStart(uniq(Boxes).encouragedBoxes, shot.r)) |
112 | uniq(Boxes).change(); |
113 | feedback(new GoodResult); |
114 | } |
115 | |
116 | void no { |
117 | if (addOrMoveToStart(uniq(Boxes).discouragedBoxes, shot.r)) |
118 | uniq(Boxes).change(); |
119 | feedback(new WrongResult); |
120 | } |
121 | |
122 | void startOver { |
123 | uniq(Boxes).encouragedBoxes.clear(); |
124 | uniq(Boxes).discouragedBoxes.clear(); |
125 | uniq(Boxes).change(); |
126 | finder.reset(); |
127 | } |
128 | |
129 | void feedback(final Evaluation ev) { |
130 | finder.reset(); |
131 | thread "Feedback" { |
132 | cset(ev, +shot); |
133 | //infoMessage("Thank you, " + (ev instanceof WrongResult ? "negative" : "positive") + " feedback recorded. (id=" + ev.id + ")"); |
134 | mainConcepts.save(); |
135 | } |
136 | } |
137 | |
138 | void setRecognizing(bool b) { |
139 | recognizing = b; |
140 | frameIcon(frame, b ? #1006287 : #1006286); |
141 | setFrameTitle(frame, (b ? "[Watching] " : " [Paused] ") |
142 | + title); |
143 | } |
144 | } |
Began life as a copy of #1006242
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, sawdedvomwva, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1006246 |
Snippet name: | class FindURLBoxApp - Record browser's URL box with feedback [works] |
Eternal ID of this version: | #1006246/1 |
Text MD5: | 8f753d2b3d7c7d44668e6f0bcd24f48d |
Author: | stefan |
Category: | javax / ocr |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-12-28 14:32:28 |
Source code size: | 4247 bytes / 144 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 585 / 1007 |
Referenced in: | [show references] |