Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

121
LINES

< > BotCompany Repo | #1016916 // Recognize Firefox "Confirm close" dialog [works more or less]

JavaX source code (desktop) [tags: use-pretranspiled] - run with: x30.jar

Download Jar. Uses 408K of libraries. Click here for Pure Java version (9182L/63K).

!7

sbool real = true, test = false;
static double threshold = 0.5;

sS data = [[
  RecognizedText(r=Rect(h=12, w=54, x=627, y=309), text=Scored(score=fl "1.0", v="Confirm"))
  RecognizedText(r=Rect(h=12, w=36, x=684, y=309), text=Scored(score=fl "1.0", v="close"))
  RecognizedText(r=Rect(h=10, w=23, x=494, y=359), text=Scored(score=fl "0.9542266", v="you"))
  RecognizedText(r=Rect(h=11, w=39, x=548, y=358), text=Scored(score=fl "1.0", v="about"))
  RecognizedText(r=Rect(h=10, w=13, x=592, y=359), text=Scored(score=fl "0.9918628", v="to"))
  RecognizedText(r=Rect(h=11, w=33, x=610, y=358), text=Scored(score=fl "0.998467", v="close"))
  RecognizedText(r=Rect(h=10, w=6, x=648, y=359), text=Scored(score=fl "0.8560784", v="3"))
  RecognizedText(r=Rect(h=11, w=31, x=659, y=358), text=Scored(score=fl "1.0", v="tabs."))
  RecognizedText(r=Rect(h=13, w=50, x=695, y=359), text=Scored(score=fl "0.9463429", v="Areyou"))
  RecognizedText(r=Rect(h=10, w=33, x=812, y=359), text=Scored(score=fl "0.9773897", v="want"))
  RecognizedText(r=Rect(h=10, w=13, x=850, y=359), text=Scored(score=fl "0.9918628", v="to"))
  RecognizedText(r=Rect(h=11, w=65, x=868, y=358), text=Scored(score=fl "1.0", v="continue?"))
  RecognizedText(r=Rect(h=8, w=20, x=523, y=361), text=Scored(score=fl "0.97618467", v="are"))
  RecognizedText(r=Rect(h=8, w=28, x=751, y=361), text=Scored(score=fl "0.9821385", v="sure"))
  RecognizedText(r=Rect(h=11, w=23, x=783, y=361), text=Scored(score=fl "0.9744504", v="you"))
  RecognizedText(r=Rect(h=11, w=43, x=765, y=406), text=Scored(score=fl "0.99504626", v="Cancel"), clickTarget="Cancel")
  RecognizedText(r=Rect(h=11, w=35, x=855, y=406), text=Scored(score=fl "1.0", v="Close"), clickTarget="Close tabs")
  RecognizedText(r=Rect(h=11, w=28, x=895, y=406), text=Scored(score=fl "0.9762714", v="tabs"), clickTarget="Close tabs")
]];

p {
  L<RecognizedText> expected = map unstruct(tlft(data));
  
  if (test)
    selfTest(expected);
  
  if (real) {
    print("\nLive mode!\n");
    mouseMover().endAfterInterference = false;
    repeat with sleep 1 {
      if (mouseMover().active2()) {
        Pair<Double, Pt> p = recognize(expected, shootScreen2());
        if (p != null && p.a >= threshold) {
          print("Found dialog at " + p.b);
          L<Pt> targets = getClickTargets(expected, p.b).get("Cancel");
          mouseMover().moveMouse(oneOf(targets));
        } else print("No dialog found");
      }
    }
  }
}

svoid selfTest(L<RecognizedText> expected) {  
  bool failures = false;
  for (S imageID, Bool containsDialog : litorderedmap(#1101350, true, #1101351, true, #1101320, false)) {
    Pair<Double, Pt> p = recognize(expected, loadImage2(imageID));
    print(containsDialog + " / " + p);
    
    bool found = p != null && p.a >= threshold;
    if (containsDialog != found) { print("detection failure"); failures = true; }
    else if (found) {
      print("Found dialog correctly");
      //MultiMap<S, Pt> targets = getClickTargets(expected, p.b);
    }
  }
}

static MultiMap<S, Pt> getClickTargets(L<RecognizedText> expected, Pt shift) {
  new MultiMap<S, Pt> mm;
  for (RecognizedText t : expected) {
    S ct = getString(t, 'clickTarget);
    if (ct != null) {
      Pt pt = ptAdd(rectCenter(t.r), shift);
      print("Click target: " + ct + " => " + pt);
      mm.put(ct, pt);
    }
  }
  ret mm;
}

// returns (closeness, shift)
static Pair<Double, Pt> recognize(L<RecognizedText> expected, BufferedImage img) {
  L<RecognizedText> actual = ocr_recognizeMultiLine_scored(img);
  
  MultiMap<S, RecognizedText> byWord = multiMapIndexOverMethod(actual, 'text);
  
  new Best<Pt> bestShift;
  bestShift.put(pt(0, 0), tryShift(expected, byWord, pt(0, 0)));
  
  Map<Pt, Int> shifts = multiSetAsMap_popularFirst(possibleShifts(expected, byWord));
  //pnlStruct(shifts);
  Pt shift = firstKey(shifts);
  bestShift.put(shift, tryShift(expected, byWord, shift));
  ret best_reversedPair(bestShift);
}

static MultiSet<Pt> possibleShifts(L<RecognizedText> expected, MultiMap<S, RecognizedText> byWord) {
  new MultiSet<Pt> ms;
  for (RecognizedText t : expected) {
    L<RecognizedText> list = byWord.get(t.text());
    if (empty(list)) continue;
    final Pt p = rectCenter(t.r);
    for (RecognizedText r : list)
      ms.add(ptDiff(rectCenter(r.r), p));
  }
  ret ms;
}

static double tryShift(L<RecognizedText> expected, MultiMap<S, RecognizedText> byWord, Pt shift) {
  double closeness = 0;
  for (RecognizedText t : expected) {
    L<RecognizedText> list = byWord.get(t.text());
    //print(t.text() + " " + t.r + " => " + struct(collect('r, list)));
    if (empty(list)) continue;
    final Pt p = ptAdd(rectCenter(t.r), shift);
    double dist = sqrt(minOfDoubles(map(list, func(RecognizedText r) {
      ptDistanceSquared(p, rectCenter(r.r))
    })));
    closeness += 1/(dist+1);
    //print(t.text() + " | dist=" + dist + ", c=" + closeness);
  }
  closeness /= l(expected);
  //print("Closeness: " + closeness + " (" + l(expected) + ")");
  ret closeness;
}

download  show line numbers  debug dex  old transpilations   

Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, rbqtzklnwohg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1016916
Snippet name: Recognize Firefox "Confirm close" dialog [works more or less]
Eternal ID of this version: #1016916/45
Text MD5: 0121e401a63cbdfd09979f5433a2d0d9
Transpilation MD5: 4f9a07ba3a9e145209a4b11a82c041e8
Author: stefan
Category: javax / ocr
Type: JavaX source code (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2018-07-08 21:29:13
Source code size: 5136 bytes / 121 lines
Pitched / IR pitched: No / No
Views / Downloads: 585 / 1302
Version history: 44 change(s)
Referenced in: [show references]