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

83
LINES

< > BotCompany Repo | #1036033 // G22FindSimilarMasksTask

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (29432L/180K).

sclass G22FindSimilarMasksTask<A> {
  // Image we are looking up
  settable Image2B queryImage;
  
  // optional - which primary mask holder is tasked with the search
  settable IG22MasksHolder maskSet;
  
  // where the found masks go (probability = similarity)
  settable new ProbabilisticList<FoundMask> outList;
  
  // probabilistic stack & scheduler
  settable new PStack pstack;
  
  // how many full mask comparisons were made
  int comparisons;
  
  // We all know what this is for
  settable bool verbose;
  
  // Has the search been ended?
  settable bool ended;
  
  class FoundMask {
    settable IG22Mask<A> mask;
    settable double similarity; // zero to one
    settable int candidateNumber;
    settable long stepCount;
    settable double foundAtProbability;
    
    Image2B image() { ret mask.image(); }
    A label() { ret mask.label(); }
    
    toString {
      ret renderVars("FoundMask",
        +label(),
        similarity := formatPercent(similarity),
        +candidateNumber);
    }
  }
  
  *() {}
  *(IG22Mask<A> mask) { queryImage(mask.image()); }
  *(Image2B image) { queryImage(image); }
  *(IImageRegion region, IG22MasksHolder *maskSet) {
    queryImage(maskSet.regionToMaskImage(region));
  }
  
  IProbabilisticScheduler scheduler() { ret pstack.scheduler(); }
  
  void tryMask(IG22Mask<A> candidate) {
    if (candidate == null) ret;
    comparisons++;
    var candidateImage = candidate.image();
    long diff = binaryImagePixelDifference_sameSize(queryImage, candidateImage);
          
    double p = liftProbabilityOffGround(1-doubleRatio(diff, area(candidateImage)));
    if (verbose)
      printVars("Candidate tested", +diff, +p, +candidate);
    foundMask(candidate, p);
  }
  
  void foundMask(IG22Mask<A> mask, double similarity) {
    long stepCount = scheduler().stepCount();
    if (verbose)
      print("Found mask with similarity " + formatDouble3X(similarity) + " in step " + stepCount);
    outList.at(similarity,
      new FoundMask().
        // actual result
        +mask.+similarity
        
        // stats to test effectivity of search heuristic
        .candidateNumber(comparisons).+stepCount
        .foundAtProbability(scheduler().currentProbability()));
  }
  
  void endSearch { ended(true); }
  
  // one-stop function
  ProbabilisticList<FoundMask> get(IG22MasksHolder maskSet default maskSet) {
    pstack.run(maskSet.findSimilarMasks(this));
    ret outList;
  }
}

download  show line numbers  debug dex  old transpilations   

Travelled to 2 computer(s): elmgxqgtpvxh, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1036033
Snippet name: G22FindSimilarMasksTask
Eternal ID of this version: #1036033/27
Text MD5: 9c6918e89f26b4132ac59462319856a4
Transpilation MD5: 4aa9e9b50f559559a0490b43a4dc6cc3
Author: stefan
Category: javax / gazelle 22
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2023-02-14 12:20:34
Source code size: 2524 bytes / 83 lines
Pitched / IR pitched: No / No
Views / Downloads: 267 / 456
Version history: 26 change(s)
Referenced in: [show references]